Java枚举类

标签 java oop enums

我正在实现枚举类,我将使用它来检索应用程序中的一些背景, 此类的当前实现在这里:

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;

最佳答案

你总是可以将你的画家定义为一个接口(interface),并让你的枚举实现它。您将无法使用通用通配符,但只要这不是约束,您也可以按照您想要的方式在代码中引用画家:

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

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

    private Painter<Component> _painter;

    // ...
}

Painter somePainter = Painters.Background;

您的枚举将有效地代理实际的 painter 实现。

关于Java枚举类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10371881/

相关文章:

enums - 我最接近通过 char 区分枚举的是什么?

java - 增强的 for 循环不接受 Iterator

c++ - 如何将公共(public)接口(interface)的子集暴露给类

java - 是否可以弃用 Java 枚举的某些值,如果可以,如何弃用?

c - C结构编译失败

oop - 清洁架构 - Robert Martin - 用例粒度

java - 容器在 jenkins 中启动失败

java - 存储库 Spring-Data-Cassandra 的自定义实现

java - 这是将可选数据结构组合成值对象的最佳方式吗?

php - 如何从 PHP 中的公共(public)静态方法访问私有(private)类的属性