gpt4 book ai didi

java - Java 中的常量数组

转载 作者:行者123 更新时间:2023-11-29 09:53:45 26 4
gpt4 key购买 nike

我有一个 Move 类,它是不可变的(基本上它只是两个整数)。

我有类 Moves 和常量:

public class Moves {

public static final Move NW = Move.make(-1, -1);
public static final Move N = Move.make(0, -1);
public static final Move NE = Move.make(1, -1);
public static final Move E = Move.make(1, 0);
public static final Move SE = Move.make(1, 1);
public static final Move S = Move.make(0, 1);
public static final Move SW = Move.make(-1, 1);
public static final Move W = Move.make(-1, 0);

public final static Move[] ALL = {
NW, N, NE, E, SE, S, SW, W
};

public final static Move[] CARDINAL = {
N, E, S, W
};
}

我需要以下方法的数组:

public void walkToRandomSide(Move[] possibleMoves)

它工作得很好,但是 - 显然 - ALLCARDINAL 的元素可以由任何人随时更改。当然,我知道不能将元素设为最终元素。

这很糟糕 - 我希望它成为库的一部分,并且尽可能稳定和可预测。

我该如何解决这个问题?做一个每次创建一个新数组的方法?

最佳答案

不,只是避免使用数组。数组始终是可变的,即使您每次都创建一个新数组,这也意味着您的调用者在传递集合时必须执行防御性复制。

首先,我会按照 Steve 的建议将您的 Move 类更改为枚举。然后任何人都可以使用 EnumSet.allOf

其次,对于 CARDINAL,我要么使用 Collections.unmodifiableList 来包装您在内部创建的列表(并且知道您永远不会修改自己), 或者使用明确讨论不变性的类型,例如 ImmutableList来自 Guava (或者可能是 ImmutableSet,取决于顺序是否重要)。

使用单独类型的好处是,您可以让调用者清楚地知道它 是不可变的,而不是仅仅记录返回的列表发生是不可变的。虽然通常使用接口(interface)作为返回类型是个好主意,但在这里值得在类型系统中传达一个非常具体的保证 - 保证调用者也可以在他们的代码中使用。

关于java - Java 中的常量数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23702038/

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