我有两个类似的枚举:
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*/ }
}
如何在界面中抽象这些枚举的功能,并通过传递接口在测试类中仅使用一个方法而不是两个方法。
编辑:我不希望合并枚举。我需要单独的枚举。
答案 0 :(得分:0)
有一件事是肯定的:只要x
和y
为private
并且无法从课外读取它们 - 您必须实现相同的方法每个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;
}
注意:类型名称应以大写字母开头。 enum1
和test
应为Enum1
和Test
。
答案 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();
}
}