首页 > 解决方案 > 避免静态方法创建具有相同值的实例

问题描述

我的程序应该无法创建具有相同名称的值的新实例,但我不知道该怎么做。我想在代码中放一些 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.");
    }

}

标签: java

解决方案


不会为你做功课,而是一些指导:

  • 是的,当一个 Smurf 实例具有name时,您需要在类中为该名称提供一个非静态字段
  • 但是:当您想确保名称是唯一的时,您需要以某种方式跟踪所有已知/使用的名称

一个非常简单(容易出错,不适合现实世界)的解决方案:您可以private static final List<String> usedNames = new ArrayList<>()在该类中拥有一个。

该列表是static,因此您的类的所有实例都会看到相同的列表。

现在您可以检查您的创建方法,作为参数提供的名称是否已经在该列表中。如果是这样,请拒绝创建新的 Smurf。否则,创建新的 Smurf,并将新名称添加到该列表中。

如果您想知道“为什么这在现实世界中不起作用”:因为 A)Smurf 类跟踪所有Smurf 名称是一个糟糕的设计,并且 B)也许 GargamelCareless Smurf在某个时候吃东西。然后,您需要额外的代码才能从列表中删除该名称。Careless Smurf或者,当您想要重新生成时,您无法再次使用该名称。等等。

注意:尽管在撰写此答案期间没有蓝精灵受到伤害。


推荐阅读