提取枚举的功能

时间:2017-07-31 09:41:44

标签: java enums interface

我有两个类似的枚举:

public enum enum1{
     A(1,1),
     B(2,2);
     private final int x,y;
     enum1(int x,int y){
         this.x=x;
         this.y=y;
     }
     int func(){ return this.x+this.y; } 
}


public enum enum2{
     C(3,3),
     D(4,4);
     private final int x,y;
     enum2(int x,int y){
         this.x=x;
         this.y=y;
     }
     int func(){ return this.x+this.y;} 
}

public class test{

    void method(enum1 e){ /*something using func*/ }

    void method(enum2 e){ /*something using func*/ }
}

如何在界面中抽象这些枚举的功能,并通过传递接口在测试类中仅使用一个方法而不是两个方法。

编辑:我不希望合并枚举。我需要单独的枚举。

2 个答案:

答案 0 :(得分:0)

有一件事是肯定的:只要xyprivate并且无法从课外读取它们 - 您必须实现相同的方法每个enum。如果您允许合理的更改为枚举中的这些字段添加访问者,那么您可以使用接口的default方法来实现伞形行为:

interface Addable {

    int getX();
    int getY();

    default int add() {
        return getX() + getY();
    }
}

enum Enum1 implements Addable {
    A(1, 1), B(2, 2);

    private final int x, y;

    Enum1(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public int getX() {
        return x;
    }

    @Override
    public int getY() {
        return y;
    }
}

然后,您可以拨打Enum1.B.add()之类的电话,这将提供4。至于你的考试类:

public class Test {
    void method(Addable e) { e.add(); }
}

现在对任何实现Addable的内容都有效。

如果您担心代码膨胀,我建议您使用Lombok

@RequiredArgsConstructor
enum Enum1 implements Addable {
    A(1, 1), B(2, 2);

    @Getter
    private final int x, y;
}

注意:类型名称应以大写字母开头。 enum1test应为Enum1Test

答案 1 :(得分:0)

创建一个由每个枚举实现的接口,只有“问题”该方法必须公开:

public interface Inter {
    public void func();
}

public enum Enum1 implements Inter {
    A(1,1),
    B(2,2);
    private final int x,y;
    Enum1(int x,int y) {
        this.x=x;
        this.y=y;
    }
    @Overwrite
    public int func() { return this.x+this.y; } 
}


public enum Enum2 implements Inter {
    ...
    @Overwrite
    public int func() { ... }
}

public class Test {

    void method(Inter e) {
        // something using func
        int sum = e.func();
    }
}