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

Java中作为对象实例的枚举值,java,enums,wrapper,Java,Enums,Wrapper,我有一个实现接口的枚举 目前,每个值都在枚举中定义,并为每个值创建一个匿名类以覆盖接口方法,例如 interface IReceiver { void receive(Object o); } 使用枚举: enum Receivers implements IReceiver { FIRST() { @Override void receive(Object o) { System.out.println(o); } }, SEC

我有一个实现接口的枚举

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

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中所能获得的一样好

编辑
使用枚举的原因是为了提供一种清晰、简单的方法来映射到此接口的单个实例,使用字符串名

,如果我理解您的设计目标,您实际上可能根本不需要使用
enum
来实现接口

相反,您可以使用构造函数注入一个
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;
    }
}

在Java8中,可以将FunctionInterface作为构造函数参数。我认为您的解决方案中使用IReceiver构造函数参数没有任何问题。我的意思是,这和后者一样简单。仅供参考:枚举的使用是为了明确每个实例都只有一个实例,并且为了能够从字符串映射到这些接口实例,您是否建议我然后通过字段访问这些接口实例?例如,提供一个getter?这会起作用,通过防止包装每个方法的需要,尽管它确实使访问枚举值变得更容易difficult@JoshBambrick是的,没错。忘记在代码中添加getter,正在修复。它不会改变枚举值的可访问性,但在语法上会稍微重一些,因为您需要对值调用getter。在我的特定脱机示例中,此解决方案非常有意义,因为我已经在使用getter从字符串返回值,我可以修改它来返回一个枚举值的字段