2011-08-22 12 views
11

これが公式化されているように不適切であるかどうかを教えてください(特に、Programmers.SEなどが問題に適しているかどうか)。効果的な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 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 
    } 
} 

アーネスト・フリードマン・ヒルは、Scalaは(私はそれを理解し、これはJVM上の特徴を実装する方法である)あなたのためにこれを行いカントー言うように。

1

あなたは純粋なJavaのlombokの使用を検討する場合には、あなたがこのような@Delegateを使って、あなたの人生を簡素化することができます:

public class SomeObject implements Updatable, Loadable { 
    @Delegate private final Updatable updatable = new DefaultUpdatable(); 
    @Delegate private final Loadable loadable = new DefaultLoadable(); 
} 
関連する問題