在Java中,在枚举值之间共享功能的最佳方式是什么?

在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

我正在考虑在enum值之间创建公共功能的最佳方法,这些值实现在enum中声明的抽象方法。
例如,我想共享由
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个公共方法调用。没什么不对的。