避免静态方法创建具有相同值的实例
我的程序应该无法创建具有相同名称值的新实例,但我不知道该怎么做。我想在代码中加入一些 if 语句,但不知道如何实现它
public class Smurf {
private String name;
public static Smurf createSmurf(String name) {
System.out.println("Creating " + name + " Smurf");
return new Smurf(name);
}
private Smurf(String name) {
this.name = name;
}
public void printName() {
System.out.println("My name is " + name + " Smurf.");
}
public void eat() {
System.out.println(name + " Smurf is eating Smurfberries.");
}
}
回答
不会为你做功课,而是一些指导:
- 是的,当一个 Smurf 实例有一个name 时,那么您的类中需要一个非静态字段来表示该名称
- 但是:当您想确保名称是唯一的时,您需要以某种方式跟踪所有已知/使用过的名称
一个非常简单(容易出错,不适合现实世界)的解决方案:您可以private static final List<String> usedNames = new ArrayList<>()在该类中使用一个。
该列表是static,因此类的所有实例都会看到相同的列表。
现在您可以检查您的创建方法,是否作为参数提供的名称已经在该列表中。如果是这样,请拒绝创建新的 Smurf。否则,创建新的 Smurf,并将新名称添加到该列表中。
如果您想知道“为什么这在现实世界中不起作用”:因为 A) Smurf 类跟踪所有Smurf 名称是一个糟糕的设计,并且 B) 也许 GargamelCareless Smurf在某个时候吃东西。然后您需要额外的代码才能从列表中删除该名称。或者,当Careless Smurf想要重新生成时,您不能再次使用该名称。等等。
注意:尽管在撰写此答案期间没有蓝精灵受到伤害。