gpt4 book ai didi

java - 扩展 Java 枚举

转载 作者:搜寻专家 更新时间:2023-10-31 19:48:47 26 4
gpt4 key购买 nike

我有一个关于在处理 Java 枚举时代码重用的最佳设计模式的问题。基本上,我想要实现的目标是能够定义几个对静态业务集合(常量集)建模的枚举,但我也想以最少的编码在它们之间共享行为。

这对于从抽象类继承类来实现是微不足道的,但是,由于 Java 枚举不能扩展(它们只能实现接口(interface)),这种类型的工作很乏味并且涉及很多容易出错的复制/粘贴工作(复制从枚举到枚举的代码)。应在所有枚举之间共享的“业务逻辑”示例包括从/到字符串的转换、实例和逻辑比较等。

我现在最好的办法是将帮助类与业务接口(interface)结合使用,但这仅能降低代码复杂性(因为所有枚举仍然必须声明和调用帮助类)。请参阅示例(只是为了澄清):

public enum MyEnum {
A, B, C;

// Just about any method fits the description - equals() is a mere example
public boolean equals(MyEnum that) {
ObjectUtils.equals(this, that);
}
}

StackOverflowers 如何处理这种“语言特性”?

最佳答案

您可以将可重用逻辑移动到专用(非枚举)类,然后让枚举委托(delegate)给这些类。这是一个例子:

[旁注:不推荐继承 PlusTwo extends PlusOne(b/c PlusTwo 不是 PlusOne)。它在这里只是为了说明能够扩展现有逻辑的意义。]

public interface Logic {
public int calc(int n);
}

public static class PlusOne implements Logic {
public int calc(int n) { return n + 1; }
}

public static class PlusTwo extends PlusOne {
@Override
public int calc(int n) { return super.calc(n) + 1; }
}

public static enum X {
X1, X2;
public Logic logic;

public int doSomething() {
return logic.calc(10);
}
}

public static enum Y {
Y1, Y2;
public Logic logic;

public String doSomethingElse() {
return "Your result is '" + logic.calc(10) + "'";
}
}

public static void main(String[] args) {
// One time setup of your logic:
X.X1.logic = new PlusOne();
X.X2.logic = new PlusTwo();
Y.Y1.logic = new PlusOne();
Y.Y2.logic = new PlusTwo();

System.out.println(X.X1.doSomething());
System.out.println(X.X2.doSomething());
System.out.println(Y.Y1.doSomethingElse());
System.out.println(Y.Y2.doSomethingElse());
}

关于java - 扩展 Java 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8806368/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com