我正在設計一個選項分配框架。分層選項分配繼承
我構建的期權類別:
public class MyOptionModule {
public MyOptionModule() {
}
public void addOption(String option, String explanation) {
//...
}
public void printHelp() {
//...
}
public void parse(String[] args) {
//...
}
}
對於每一個需要用戶輸入選項模塊,它將有一個靜態方法:
public static void assignOptions(MyOptionModule optionModule) {
optionModule.addOption("o", "Some options");
}
在更復雜的情況下,一些模塊可能包括其他模塊工作。這裏有一個例子:
class ReaderClass {
public static void assignOptions(MyOptionModule optionModule) {
optionModule.addOption("i", "Input file for reader");
}
}
class WriterClass {
public static void assignOptions(MyOptionModule optionModule) {
optionModule.addOption("o", "Output file for reader");
}
}
public class OutClass {
public static void assignOptions(MyOptionModule optionModule) {
optionModule.addOption("x", "Some other options in Out Class");
optionModule.addOption("y", "Some other options in Out Class");
optionModule.addOption("z", "Some other options in Out Class");
}
public static void main(String[] args) {
MyOptionModule optionModule = new MyOptionModule();
ReaderClass.assignOptions(optionModule);
WriterClass.assignOptions(optionModule);
OutClass.assignOptions(optionModule);
if (args.length == 0) {
optionModule.printHelp();
}
optionModule.parse(args);
}
}
的例子幫助菜單:
/*
======== The help menu ========
i: Input file for reader
o: Output file for reader
x: Some other options in Out Class
y: Some other options in Out Class
z: Some other options in Out Class
*/
現在我的問題是,我的計劃是給一些不知名的模塊,我想打電話給他們的assignOptions。
Class<? extends XXXX> toolClass = null; // Some class with assignOptions
try {
toolClass.getMethod("assignOptions", MyOptionModule.class).invoke(null, optionModule);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
// Exceptions, no options if NoSuchMethodException
}
儘管可以使用反射,但是如果我可以檢查某個類是否實現assignOptions方法,那將會很好。 assignOptions應該是靜態的,因爲類實例與要分配的選項無關。但是,我們不能將靜態方法的接口用於這種指示(它已經進行了很多討論)。那麼有沒有什麼設計可以避免反射,而我們無法在界面中獲得靜態方法?謝謝!
使用java 8,你可以在接口的靜態方法;) –
你可以使用抽象類的靜態方法宣告存在的,而不是接口? –
感謝您的想法,但我不認爲這是可能的。因爲在我的設計,我需要讓類中重寫靜態方法,爲每個類都有不同的選項來進行分配。 –