2011-08-22 37 views
11

請讓我知道,如果這是不合適的制定(特別是否程序員.S或其他東西會更好的問題。)如何實現有效的Java特性?

好的。所以我有很多'特質',我目前正在表達爲接口。我們稱它們爲「可更新」和「可破壞」。將它們表示爲接口有一個缺點,就是我無法在所有「可破壞」的組件之間共享行爲;另一方面,將這些表達爲抽象類意味着如果不將混合特徵明確定義爲另一個抽象類(「UpdateableAndDestructible」),那麼就不能混合和匹配,並且此時感覺就像是濫用了抽象類功能。但是,如果沒有更好的方法來處理這個問題,那麼我最終可能會這樣做。

對於這個難題,純Java解決方案有哪些選擇?我是否有可能描述共享行爲,然後按照我認爲合適的方式進行混合和匹配,而不必明確描述我將要使用的每個排列組合?

+2

你descibing *混入* - 這可能是一個有用的術語,如果你正在做一個搜索。 – Jesper

回答

6

也許你可以通過使用接口和默認實現混合來實現目標。

像:

public interface Updatable { 
    void updated(); 
} 

public interface Loadable { 
    void load(); 
} 

public class DefaultUpdatable implements Updatable { 
... 
} 

public class DefaultLoadable implements Loadable { 
... 
} 

public class SomeObject implements Updatable, Loadable { 
    private final Updatable updatable = new DefaultUpdatable(); 
    private final Loadable loadable = new DefaultLoadable(); 

    public void load() { 
    this.loadable.load(); 
    } 

    public void updated() { 
    this.updatable.updated(); 
    } 
} 

仍有噪音,也許不夠靈活,你想,但也許比做UpdatableAndDestructable事情清潔了一下。

+0

+1並且接受,這是處理問題的明智方式。 (順帶一提,在研究這個過程時,我發現了一些有用的框架,比如Guice,這使得使用這種邏輯有點痛苦。) –

4

我知道你說過「純Java」,但這是Scala做得很好。 Java語言本身的侷限性是人們採用其他JVM語言的強有力的驅動因素......

+0

感謝您的建議。 –

5

我不認爲有這個問題的一個漂亮的解決方案,但也許一些可行的取決於你多麼鄙視樣板。

您可以將trait定義爲另一個類+接口,它將實例對象作爲第一個參數。並且他們實現與你想擁有這個特性的類的接口。然後創建調用trait impl方法的存根方法。

public class MyClass implements MyTrait { 
    @Override 
    public void doSomething() { 
     MyTraitImpl.doSomething(this); 
    } 
} 

再爲特質本身:

public interface MyTrait { 
    public void doSomething(); 
} 

public class MyTraitImpl { 
    public static void doSomething(MyTrait obj) { 
     // do something with obj 
    } 
} 

歐內斯特·弗裏德曼 - 希爾說,壽,斯卡拉做這件事情(據我所知,這是如何實現的JVM性狀) 。

1

在你考慮使用lombok作爲純Java的情況下,可以通過使用@Delegate像這樣簡化你的生活:

public class SomeObject implements Updatable, Loadable { 
    @Delegate private final Updatable updatable = new DefaultUpdatable(); 
    @Delegate private final Loadable loadable = new DefaultLoadable(); 
}