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

时间:2015-12-19 16:17:53

标签: java design-patterns enums

我正在考虑在枚举值之间创建通用功能的最佳方法,它实现了在枚举中声明的抽象方法。
例如,我想分享VALUE1VALUE2定义的方法的第一行:

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);
}

目前,我只是重复每个值的代码,但我确信有更好的方法 任何帮助都感激不尽!

2 个答案:

答案 0 :(得分:0)

我不确定这对你来说是否更好,但我喜欢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);
    }
}

它仍然重复你的方法调用,但它看起来更干净。

答案 1 :(得分:-1)

您可以实施&#34; generic&#34; &#34; base enum class&#34;并将具体操作定义为抽象,因此必须实现:

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();
}