Như người khác đã nói, không có điều nào như # define/# ifdef trong Java. Nhưng liên quan đến vấn đề của bạn có thư viện bên ngoài tùy chọn, mà bạn sẽ sử dụng, nếu có, và không sử dụng nếu không, sử dụng các lớp proxy có thể là một tùy chọn (nếu giao diện thư viện không quá lớn).
Tôi phải thực hiện việc này một lần cho các tiện ích mở rộng cụ thể của Mac OS X cho AWT/Swing (được tìm thấy trong com.apple.eawt. *). Các lớp học, tất nhiên, chỉ trên đường dẫn lớp nếu ứng dụng đang chạy trên Mac OS. Để có thể sử dụng chúng nhưng vẫn cho phép ứng dụng tương tự được sử dụng trên các nền tảng khác, tôi đã viết các lớp proxy đơn giản, chỉ cung cấp các phương thức tương tự như các lớp EAWT gốc. Bên trong, các proxy sử dụng một số phản ánh để xác định xem các lớp thực sự có trên đường dẫn lớp và sẽ truyền qua tất cả các cuộc gọi phương thức hay không. Bằng cách sử dụng lớp java.lang.reflect.Proxy, bạn thậm chí có thể tạo và truyền xung quanh các đối tượng thuộc loại được xác định trong thư viện bên ngoài mà không cần phải có sẵn tại thời gian biên dịch.
Ví dụ, proxy cho com.apple.eawt.ApplicationListener trông như thế này:
public class ApplicationListener {
private static Class<?> nativeClass;
static Class<?> getNativeClass() {
try {
if (ApplicationListener.nativeClass == null) {
ApplicationListener.nativeClass = Class.forName("com.apple.eawt.ApplicationListener");
}
return ApplicationListener.nativeClass;
} catch (ClassNotFoundException ex) {
throw new RuntimeException("This system does not support the Apple EAWT!", ex);
}
}
private Object nativeObject;
public ApplicationListener() {
Class<?> nativeClass = ApplicationListener.getNativeClass();
this.nativeObject = Proxy.newProxyInstance(nativeClass.getClassLoader(), new Class<?>[] {
nativeClass
}, new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String methodName = method.getName();
ApplicationEvent event = new ApplicationEvent(args[0]);
if (methodName.equals("handleReOpenApplication")) {
ApplicationListener.this.handleReOpenApplication(event);
} else if (methodName.equals("handleQuit")) {
ApplicationListener.this.handleQuit(event);
} else if (methodName.equals("handlePrintFile")) {
ApplicationListener.this.handlePrintFile(event);
} else if (methodName.equals("handlePreferences")) {
ApplicationListener.this.handlePreferences(event);
} else if (methodName.equals("handleOpenFile")) {
ApplicationListener.this.handleOpenFile(event);
} else if (methodName.equals("handleOpenApplication")) {
ApplicationListener.this.handleOpenApplication(event);
} else if (methodName.equals("handleAbout")) {
ApplicationListener.this.handleAbout(event);
}
return null;
}
});
}
Object getNativeObject() {
return this.nativeObject;
}
// followed by abstract definitions of all handle...(ApplicationEvent) methods
}
Tất cả điều này chỉ có ý nghĩa, nếu bạn cần chỉ là một vài lớp học từ một thư viện bên ngoài, bởi vì bạn phải làm mọi thứ thông qua sự phản chiếu trong thời gian chạy. Đối với các thư viện lớn hơn, có thể bạn sẽ cần một số cách để tự động hóa việc tạo các proxy. Nhưng sau đó, nếu bạn thực sự là phụ thuộc vào một thư viện bên ngoài lớn, bạn chỉ nên yêu cầu nó tại thời gian biên dịch.
Comment by Peter Lawrey: (Xin lỗi để chỉnh sửa, rất khó để đưa mã của nó vào một bình luận)
Các theo gương là chung chung bằng phương pháp do đó bạn không cần phải biết tất cả các phương pháp có liên quan. Bạn cũng có thể làm cho lớp chung này theo lớp, do đó bạn chỉ cần một lớp InvocationHandler được mã hóa để bao gồm tất cả các trường hợp.
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String methodName = method.getName();
ApplicationEvent event = new ApplicationEvent(args[0]);
Method method = ApplicationListener.class.getMethod(methodName, ApplicationEvent.class);
return method.invoke(ApplicationListener.this, event);
}
Tôi không nghĩ rằng đây là những gì anh ta đang tìm kiếm. Anh ta không muốn các hằng số tượng trưng, nhưng tương đương với việc biên dịch có điều kiện. Không biết java, tôi không có một đầu mối, mặc dù ... – dmckee
những gì về trình biên dịch có điều kiện? Làm thế nào để bạn làm điều đó trong java? – Russell
Bài viết tôi đã liên kết thảo luận về vấn đề này. –