繁体   English   中英

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

[英]In Java, what is the best way to share functionality between enum value?

我正在考虑在枚举值之间创建通用功能的最佳方法,这些值实现枚举中声明的抽象方法。
例如,我想共享由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);
}

目前,我只为每个值重复执行代码,但是我敢肯定有更好的方法。
任何帮助都感激不尽!

我不确定这是否对您更好,但是对于这种情况,我喜欢使用lambda。 我让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);
    }
}

它仍然重复您的方法调用,但是在我看来,它看起来更干净。

您可以在“基本枚举类”上实现“泛型”操作,并将特定操作定义为抽象,因此必须实现:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM