我有一个实现接口(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/