2016-06-08 50 views
0

我想不出一個很好的方式來命名它。基本上我有一個程序,我希望有一個默認的「模式」,差不多我猜應該如何運作。但我想允許使用它來創建它們自己的類的實現(這就像一個API),並將其用作參數,而不是內部的功能。這是最有效的方法嗎?如果你不明白這裏的壞描述就是一個例子。Java:使用一個類作爲參數來描述一個設置

public class SimpleStyle extends AbstractStyle { 

    public void personalizedImplementation() { 
     // manipulate the program this way 
    } 

} 

則在該方法

public static void do(Class<? extends AbstractSyle> style) { 
    // Use reflection in herre to get the implementation and do it 
} 

是否有更好和更有效的方式做這樣的事情

回答

0

你不應該使用反射這個任務,如果你能避免它。與精心設計的界面相比,它的可讀性和錯誤率都較低。

基本解決(我不知道你是否已經考慮它)是簡單地傳遞的AbstractStyle情況下,你的方法:

public static void doSomething(AbstractStyle style) { 
    style.personalizedImplementation(); 
} 

public static void main(String[] args) { 
    do(new SimpleStyle()); 
} 

如果您不能使用此方法 - 這取決於具體使用案例 - 你可以定義一個額外的接口處理AbstractStyle實例的創建:

public interface StyleFactory { 
    AbstractStyle createStyle(); 
} 

public class SimpleStyleFactory implements StyleFactory { 
    @Override 
    public SimpleStyle createStyle() { 
     return new SimpleStyle(/* ... */); 
    } 
} 

public static void doSomething(StyleFactory styleFactory) { 
    AbstractStyle style = styleFactory.createStyle(); 
    style.personalizedImplementation(); 
} 

public static void main(String[] args) { 
    do(new SimpleStyleFactory()); 
} 

注意:do是一個Java關鍵字,因此它不能用作標識符。我用doSomething代替。

+0

我從來沒有看到該構建器模式的好處,在'createStyle'的'AbstractStyle'中有一個抽象方法來強制類有一個靜態方法來創建一個新實例,而不是工廠界面的所有樣板代碼和不同實現的多個工廠 – Elliott

+0

@Elliott我同意,但靜態方法不能被繼承。這意味着你不能強制'SimpleStyle'有一個靜態的'createStyle'方法,即使它有一個,你也不能以通用的方式安全地調用它。 –

+0

@Elliott將方法聲明爲「靜態抽象」應該會引發編譯器錯誤。有關詳細信息,請參閱[此問題](http://stackoverflow.com/questions/370962/why-cant-static-methods-be-abstract-in-java)。 –

相關問題