【发布时间】:2016-03-07 20:30:23
【问题描述】:
我想问一下是否有办法限制某个类生成超过一定数量的实例。如果可以使编译器(“Eclipse”)在该行下划线,当您尝试创建另一个实例时(例如代码中的错误),或者类似这些行的东西?
只是为了澄清那些会说这是一个坏主意的人,我正在制作一个国际象棋游戏,所以我需要它不能制作超过一定数量的棋子。
【问题讨论】:
我想问一下是否有办法限制某个类生成超过一定数量的实例。如果可以使编译器(“Eclipse”)在该行下划线,当您尝试创建另一个实例时(例如代码中的错误),或者类似这些行的东西?
只是为了澄清那些会说这是一个坏主意的人,我正在制作一个国际象棋游戏,所以我需要它不能制作超过一定数量的棋子。
【问题讨论】:
Eclipse 无法在编译时执行此操作,因为它无法判断一段代码将执行多少次,从而创建了多少个实例。
但是您可以设计您的类以仅创建给定数量的实例,并使其无法创建更多实例。例如:
public class Limited {
public static final List<Limited> ALL_INSTANCES =
Collections.unmodifiableList(createInstances());
private int id;
private static List<Limited> createInstances() {
List<Limited> result = new ArrayList<>();
for (int i = 0; i < 10; i++) {
result.add(new Limited(i));
}
}
private Limited(int id) {
this.id = id;
}
}
由于构造函数是私有的,只有 10 个可用实例是 ALL_INSTANCES 中的实例。
也就是说,这不一定是个好主意。假设您正在创建一个国际象棋游戏。所以按照你的逻辑,你应该不能创建超过 2 个 King 实例。如果您的应用一次处理 10 个游戏会怎样?你真的想要最多 2 个国王,还是只希望每个 ChessGame 实例都有一个黑色和一个白色的国王?也许你所需要的只是
public class ChessGame {
private King blackKing = new King(BLACK);
private King whiteKing = new King(WHITE);
...
}
【讨论】:
您可以简单地创建所需数量的对象 - 比如说通过在循环中实例化您的类,然后设置一个由构造函数检查的标志,以便在尝试创建更多对象时抛出异常。您可以将构造函数设为私有并使用静态方法来生成实例。
【讨论】: