java - 枚举值作为 Java 中对象的实例

标签 java enums wrapper

我有一个实现接口(interface)的枚举。

目前,每个值都在枚举中定义,并为每个值创建一个匿名类来覆盖接口(interface)方法,例如

interface IReceiver {
    void receive(Object o);
}

枚举:

enum Receivers implements IReceiver {
    FIRST() {
        @Override
        void receive(Object o) { System.out.println(o); }
    },
    SECOND() {
        @Override
        void receive(Object o) { email(o); }
    };
}

相反,我想在一个单独的类中定义每个值,我在枚举中对其进行实例化,但我不想为每个值编写包装器方法,例如

enum Receivers implements IReceiver {
    FIRST(new MyFirstObject()),
    SECOND(new MySecondObject());

    IReceiver receiver;

    Receivers(IReceiver receiver) {
        this.receiver = receiver;
    }

    @Override
    void receive(Object o) {
        receiver.receive(o);
    }
}

有什么简单的方法可以做到这一点。理想情况下,像下面这样的东西会很好:

enum Receivers implements IReceiver {
    FIRST() = new MyFirstObject(),
    SECOND() = new MySecondObject();
}

如有任何建议,我们将不胜感激,但我认为我的第二个建议可能与您在 Java 中实现的一样好。

编辑 使用枚举的原因是提供一种清晰且简单的方法来映射到此接口(interface)的单个​​实例,使用字符串名称

最佳答案

如果我了解您的设计目标,您实际上可能根本不需要enum 来实现接口(interface)。

相反,您可以使用构造函数注入(inject) IReceiver,就像您在示例中所做的那样。

然后,您要么匿名实现该方法,要么在实现 IReceiver 的所需具体类中实现它。

示例

interface IReceiver {
    void receive(Object o);
}
class MyReceiver implements IReceiver {
    @Override
    public void receive(Object o) {
        // TODO Auto-generated method stub
    }
}
enum Receivers {
    // anonymous
    FIRST(
        new IReceiver() {
            @Override
            public void receive(Object o) {};
        }
    ), 
    // concrete
    SECOND(new MyReceiver());

    IReceiver receiver;

    Receivers(IReceiver receiver) {
        this.receiver = receiver;
    }

    public IReceiver getReceiver() {
        return receiver;
    }
}

关于java - 枚举值作为 Java 中对象的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31879300/

相关文章:

java - 无法调用 setVertexFillPaintTransformer - 方法不适用于参数

c# - 枚举值在 razor 页面 ASP.NET Core 3.1 上不显示 EnumMember 值

python - 如何迭代 azure.core.paging.ItemPaged?

python - Django 模型的额外参数

java - 使用 Java 将记录插入 Berkeley DB

Java:使用我的 for 语句

javascript - 在 .NET 项目上生成 JSON 后期构建

c# - 多个包装器 - 如何做?

c# - P/Invoke "Protected Memory"异常/MT或/MD

java - 在Java HashMap中,如何强制泛型类型成为子类