3

アプリケーションの背景を取得するために使用する enum クラスを実装しています。このクラスの現在の実装は次のとおりです。

public enum Painters{

    /**
     * Available painters.
     */
    Background(getBackgroundPainter()),
    InactiveBackground(getInactiveBackgroundPainter()),
    DesktopBackground(getBackgroundPainter());

    /**
     * The background painter.
     */
    private Painter<Component> _painter;

    /**
     * Constructor will initialize the object.
     */
    Painters(Painter<Component> painter){
        _painter = painter;
    }

    /**
     * Will return a current painter.
     * @return instance of Painter<Component>
     */
    public Painter<Component> painter(){
        return _painter;
    }

    private static Painter<Component> getBackgroundPainter(){
        MattePainter mp = new MattePainter(Colors.White.alpha(1f));
        PinstripePainter pp = new PinstripePainter(Colors.Gray.alpha(0.2f),45d);
       return (new CompoundPainter<Component>(mp, pp)); 
    }

    private static Painter<Component> getInactiveBackgroundPainter(){
        MattePainter mp = new MattePainter(Colors.White.alpha(1f));
        GlossPainter gp = new GlossPainter(Colors.Gray.alpha(0.1f), GlossPainter.GlossPosition.BOTTOM);
        PinstripePainter pp = new PinstripePainter(Colors.Gray.alpha(0.2f), 45d);
        return (new CompoundPainter<Component>(mp, pp, gp));    
    }
}

私の問題は、ペインターを取得しようとするたびに painter() メソッドを呼び出す必要があることですが、代わりにペインターのタイプを記述することだけを好みます。列挙型で Painter を拡張できれば、おそらく適切な機能が得られると思いましたが、Java では不可能なようです。

public enum Painters extends Painter<Component>

この問題の解決策を知っていますか???

現在、私はこのように使用しています:

Painters.Background.painter();

しかし、私は必要です:

Painters.Background;
4

2 に答える 2

2

通常Enums、スイッチ/ケースとコンストラクターのシンタックス シュガーが必要な不変定数用に予約されています。ここではファクトリ パターンがより適切です。

public class PainterFactory {
    public static Painter<Component> getBackgroundPainter(){
    ...
    }

    public static Painter<Component> getInactiveBackgroundPainter(){
    ...
    }
}
于 2012-04-29T11:58:58.710 に答える
2

いつでもペインタをインターフェイスとして定義し、列挙型に実装させることができます。一般的なワイルドカードを使用することはできませんが、それが制約ではない限り、コードでペインタを好きなように参照することもできます:

interface Painter<T> {
    // ...
}

public enum Painters implements Painter<Component> {
    Background(getBackgroundPainter()),
    InactiveBackground(getInactiveBackgroundPainter()),
    DesktopBackground(getBackgroundPainter());

    private Painter<Component> _painter;

    // ...
}

Painter somePainter = Painters.Background;

あなたの列挙型は、実際のペインターの実装を効果的にプロキシします。

于 2012-04-29T11:57:48.507 に答える