gpt4 book ai didi

java - 哪种 Java 设计模式适合下面描述的情况?

转载 作者:行者123 更新时间:2023-11-30 08:03:10 25 4
gpt4 key购买 nike

我正在开发一个化学包,我有一个类列出了元素周期表中的所有元素。理想情况下,这些元素将成为 Java 枚举的一部分。但不幸的是,我还需要一个元素作为通配符:每个其他元素都应该等于该元素。 Java 不允许重写枚举的 equals() 方法,否则我会这样做。有人能够针对我刚才描述的情况提出合理的设计模式吗?

编辑:感谢您的贡献。我确实没有观察到 equals() 所要求的传递属性。

元素周期表的元素将被分配到图结构上的不同节点(在数学意义上)。给定这个图结构,然后我在原始图中查找特定子图结构的所有嵌入(子图同构问题)。子图结构的一个所需属性是为某些节点分配通配符,以便我可以将这些节点映射到原始图中的任何节点,而不管分配给它的元素如何。这就是为什么我正在寻找一种非传递关系,使得通配符可以等于两个不同的元素,而不意味着这些元素本身是相等的。我当前的算法使用泛型并调用 equals() 来检查两个节点中的元素是否相等。

最佳答案

正如 mystarrocks 所指出的,你的设计的最大问题是它违反了等于契约。具体来说,根据 Object 类中的规范,equals 方法应该:

The equals method implements an equivalence relation on non-null object references:

  • It is reflexive: for any non-null reference value x, x.equals(x) should return true.
  • It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.
  • It is transitive: for any non-null reference values x, y, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true.
  • It is consistent: for any non-null reference values x and y, multiple invocations of x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the objects is modified.
  • For any non-null reference value x, x.equals(null) should return false.

(Source)

您的设计将违反传递性。如果钠等于通配符,通配​​符等于钾,则钠必须等于钾。

当您想要查看两个元素是否可以被视为相等(这与相等不同)时,更好的方法是创建一个辅助 equals 方法。通配符只是真正等于通配符,但可以认为它等于任何元素。

public enum Element {
HYDROGEN,
HELIUM,
SODIUM,
//.....
URANIUM,
WILD_CARD;

public boolean consideredEqual(Object other) {
if (other == null || ! (other instanceof Element)) return false;

Element e = (Element) other;
if (this.equals(Element.WILD_CARD) || e.equals(Element.WILD_CARD)) return true;
return equals(other);
}
}

关于java - 哪种 Java 设计模式适合下面描述的情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31570641/

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