在Java中,在枚举值之间共享功能的最佳方式是什么?
我正在考虑在enum值之间创建公共功能的最佳方法,这些值实现在enum中声明的抽象方法。在Java中,在枚举值之间共享功能的最佳方式是什么?,java,design-patterns,enums,Java,Design Patterns,Enums,我正在考虑在enum值之间创建公共功能的最佳方法,这些值实现在enum中声明的抽象方法。 例如,我想共享由VALUE1和VALUE2定义的第一行方法: public enum EnumExample { VALUE1() { public void doSomething(String arg) { doSomethingElse(); // I don't want to repeat this line calculateFo
例如,我想共享由
VALUE1
和VALUE2
定义的第一行方法:
public enum EnumExample {
VALUE1() {
public void doSomething(String arg) {
doSomethingElse(); // I don't want to repeat this line
calculateFoo();
},
VALUE2() {
public void doSomething(String arg) {
doSomethingElse(); // I don't want to repeat this line
calculateBar();
}
},
VALUE3() {
public void doSomething(String arg) {
doSomethingUnrelated(); // This value DOES NOT share functionality with VALUE1 & VALUE2
}
};
public abstract void doSomething(String arg);
}
目前,我只是对每个值重复代码,但我确信有更好的方法。任何帮助都将不胜感激 我不确定这是否对你有好处,但我喜欢lambdas这种情况。我让
enum
实现一个函数接口,然后每个值都可以委托给它自己的私有实现
import java.util.function.Consumer;
public enum EnumExample implements Consumer<String> {
VALUE1(t -> {
doSomethingElse();
calculateFoo();
}),
VALUE2(t -> {
doSomethingElse();
calculateFoo();
}),
VALUE3(t -> doSomethingUnrelated());
private final Consumer<String> myLambda;
EnumExample(Consumer<String> aLambda) {
myLambda = aLambda;
}
static void doSomethingElse() {}
static void calculateFoo() {}
static void doSomethingUnrelated() {}
@Override
public void accept(String t) {
myLambda.accept(t);
}
}
import java.util.function.Consumer;
公共枚举示例实现使用者{
值1(t->{
doSomethingElse();
calculatefo();
}),
值2(t->{
doSomethingElse();
calculatefo();
}),
值3(t->doSomethingUnrelated());
私人最终消费者myLambda;
EnumExample(消费者aLambda){
myLambda=aLambda;
}
静态void doSomethingElse(){}
静态void calculatefo(){}
静态void doSomethingUnrelated(){}
@凌驾
公共无效接受(字符串t){
myLambda.accept(t);
}
}
它仍然会重复您的方法调用,但在我看来更干净。您可以在“基本枚举类”上实现“泛型”操作,并将特定操作定义为抽象操作,因此必须实现:
enum EnumExample {
VALUE1 {
@Override
void doSomethingSpecific() {
System.out.println("specific for " + VALUE1);
}
},
VALUE2 {
@Override
void doSomethingSpecific() {
System.out.println("specific for" + VALUE2);
}
};
public void doSomething(){
doSomethingGeneric();
doSomethingSpecific();
}
void doSomethingGeneric(){
System.out.println("Same for all enums...");
};
abstract void doSomethingSpecific();
}
代码的意思是什么?为什么在枚举中有代码?@Pshemo你说得对-我想在一些值之间共享功能,而不是所有值。任何解决方案都会比你的解决方案更详细,可能会重复更多代码。这只是一个方法调用。我不会对代码做任何更改(当然,除了使其编译),然后将这20个LOC提取到EnumExample的方法中,并从两个enum常量调用该方法,就像在您的问题中一样。只要它是私有的,您就不必麻烦了。我认为它是一个私有方法,由一个类的两个公共方法调用,而不是由其他3个公共方法调用。没什么不对的。