2015-01-09 30 views
0

C++模板類似的功能在我的節目,我有下面的類層次結構:需要在Java中

public abstract class Effect 
    { 
    // ... 
    } 

public class Effect1 extends Effect 
    { 
    public static final NAME = "blah blah 1"; 
    // ... 
    } 

public class Effect2 extends Effect 
    { 
    public static final NAME = "blah blah 2"; 
    // ... 
    } 

(更多EffectN類具有完全不同的實現)。後來,我得到了使用這些EffectN的班別家:

public abstract class EffectList 
    { 
    protected Effect mEffect; 

    // ... 
    } 

public class EffectList1 extends EffectList 
    { 
    public static final N = Effect1.NAME; 

    public EffectList1 
    { 
    mEffect = new Effect1(); 
    } 

    // ... 
    } 

public class EffectList2 extends EffectList 
    { 
    public static final N = Effect2.NAME; 

    public EffectList2 
    { 
    mEffect = new Effect2(); 
    } 

    // ... 
    } 

(更多的EffectListN類,每個EffectN)。現在,雖然EffectN的確有非常不同的實現,但所有EffectListN都(幾乎)相同 - 它們之間的唯一區別如上所示。

現在,如果使用C++,所有EffectListN類都可以通過1個模板輕鬆生成,但AFAIK(對於Java來說相當新穎),Java泛型無法完成這項工作。

有什麼建議嗎?

+0

是[這個問題](http://stackoverflow.com/questions/1854335/how-to-create-a-java-class-similar-to-a-c-template-class)有關嗎? – jdv

回答

1

你想創建通用的方式來調用構造函數嗎?如果是這樣的話,只要所有實現都提供相同類型的參數,就可以通過反射來完成。默認的構造函數:

class EffectList<EffectType extends Effect> { 
    public EffectList(Class<EffectType> clazz) { 
    try { 
     mEffect = clazz.getConstructor().newInstance(); 
    } catch (Exception ex) { 
     // suppressing Exceptions - in production code you should handle it better 
     throw new RuntimeException(ex); 
    } 
    // ... 
    } 

    // ... 
} 

然後用它這樣的:

EffectList<Effect1> effectList1 = new EffectList(Effect1.class); 
EffectList<Effect2> effectList2 = new EffectList(Effect2.class); 

的靜電場卻無法處理這樣的方式 - 你可以做的最好的是讓一個實例變量,並通過反思獲得價值好:

clazz.getDeclaredField("NAME").get(null); // null is used to obtain static fields 

之所以靜態字段不能辦理的是,會有所有EffectLists之間共享只有一個變量(因爲它的下方僅只是一個只有類編譯時檢查添加)。

+0

謝謝,您的評論幫助我意識到靜態字段是問題的本質。我最終改變了架構,使我不再需要實例化大量的EffectListN類,而只是每個類的一個實例。這讓我擺脫了靜態領域。 – Leszek

1

我不知道如何用C++來完成它,但是關閉你的描述,不,Java泛型將無法處理這個問題。

其中之一,您有static字段取決於EffectN類型中定義的其他static字段。 Java中沒有任何內容設置一個類型應該有一個static字段的限制。你不會是能夠動態地設置

public static final N = SomeEffect.NAME; 

其次,因爲類型擦除,你不會是能夠做到

public EffectList2 
{ 
    mEffect = new SomeEffect(); // assuming SomeEffect is the type parameter 
} 

你需要在Class實例,並使用反射來傳遞實例化這種類型。