2012-04-29 5 views
3

Я реализую класс перечислимую, который я буду использовать, чтобы получить какой-то опыт в применении, текущую реализацию этого класса здесь:Java перечисление класса

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 по моему перечислению, то, вероятно, я получу нужную функциональность, но похоже, что это невозможно в java.

public enum Painters extends Painter<Component> 

Знаете ли вы какое-либо решение проблемы? ???

В настоящее время я использую его следующим образом:

Painters.Background.painter(); 

, но мне нужно:

Painters.Background; 
+0

Я думаю, вы выбрали неправильный ответ как «правильный». –

+0

На самом деле мой художник уже интерфейс, который я смутил, потому что он был без меня вначале (художник в моем случае - художник Swingx). Я считаю, что ответ прав в любом случае, потому что класс enum позволяет реализовать интерфейс, и это единственный способ реализовать то, что мне нужно. – AlexTheo

+0

Я сделал это с завода раньше, но я решил, что класс enum будет более элегантным решением. – AlexTheo

ответ

2

Вы всегда можете определить свой художник как интерфейс и ваш перечисление его реализации. Вы не сможете использовать общие символы, но до тех пор, как это еще не ограничение, вы будете иметь возможность ссылаться на художнике в коде так, как вы хотели тоже:

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

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

    private Painter<Component> _painter; 

    // ... 
} 

Painter somePainter = Painters.Background; 

Вашего перечисление будет эффективно через прокси-соединение реалистичных реализаций художника.

2

Обычно Enums зарезервированы для неизменяемых констант, где вам нужен синтаксический сахар переключателя/корпуса и конструкторов. Здесь более уместен заводской шаблон:

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

    public static Painter<Component> getInactiveBackgroundPainter(){ 
    ... 
    } 
} 
Смежные вопросы