gpt4 book ai didi

java - 重写枚举中的抽象方法时避免代码重复

转载 作者:行者123 更新时间:2023-12-05 09:22:53 27 4
gpt4 key购买 nike

我正在用 Java 枚举实现一个状态机。我在下面有一个玩具示例,其中我根据组成员身份在 XYZ 状态之间转换。

问题是,YZ 的转换规则是相同的(即,Overriden 方法是相同的)。

这里有什么办法可以避免代码重复吗?在我现实生活中的例子中,它有点严重,因此代码重复的可能性更大。

enum Group {
A,B,C
}

enum Element {
X(Group.A) {
@Override
public Element getNextElement(Element nextElement) {
if(nextElement.getGroup() == Group.B) {
return nextElement;
} else {
return this;
}
}
},
Y(Group.B) {
@Override
public Element getNextElement(Element nextElement) {
if(nextElement.getGroup() == Group.A) {
return nextElement;
} else {
return this;
}
}
},
Z(Group.C) {
@Override
public Element getNextElement(Element nextElement) {
if(nextElement.getGroup() == Group.A) {
return nextElement;
} else {
return this;
}
}
};

Group group;

Element(Group group) {
this.group=group;
};

public Group getGroup() {
return this.group;
}

public abstract Element getNextElement(Element nextElement);

}

最佳答案

鉴于您的逻辑是相同的除了转换规则中的值,您可以通过它进行参数化:

enum Element {
X(Group.A, Group.B),
Y(Group.B, Group.A),
Z(Group.C, Group.A);

private final Group group;
private final Group nextGroup

private Element(Group group, Group nextGroup) {
this.group = group;
this.nextGroup = nextGroup;
}

public Group getGroup() {
return this.group;
}

public Element getNextElement(Element nextElement) {
return nextElement.getGroup() == nextGroup ? nextElement : this;
}
}

您仍然可以在某些 值中覆盖getNextElement。例如:

enum Element {
X(Group.A, Group.B) {
@Override public Element getNextElement(Element nextElement) {
return someRandomCondition ? nextElement : this;
}
}
Y(Group.B, Group.A),
Z(Group.C, Group.A);

// Other code as above
}

关于java - 重写枚举中的抽象方法时避免代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24453602/

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