gpt4 book ai didi

java - 处理特定项目的唯一 ID 的类 -> 是否抽象?

转载 作者:行者123 更新时间:2023-12-02 11:23:01 25 4
gpt4 key购买 nike

我对编程相当陌生,尤其是 OOP 概念。我创建了一个类,该类应该处理其他类对象的唯一 ID。我只想在其构造函数中为对象分配一个唯一的 ID。

我不知道 IdHandler 类是否应该是抽象的。据我了解,如果我需要不同的 ID 命名空间(可能针对不同的仓库),我需要为每个 ID 创建一个 IdHandler 对象?我在哪里创建这些对象?在主类的开头还是在定义命名空间的构造函数中(例如 Warehouse())?

这就是 ID 类 ->

public class IdHandler {

private String newId;
private ArrayList<String> idList = new ArrayList<String>();


public String getId() {

this.newId = "";
while (this.newId == "") {
this.newId = UUID.randomUUID().toString();

// if doesn't exist already , add to list, else empty String
if (!this.idList.contains(this.newId)) {
this.idList.add(this.newId);
break;
}

else
this.newId = "";
}
return this.newId;

}
}

最佳答案

不清楚您的类是否应该保存对象的 ID,或者它是否用于生成对象将保存其自身的唯一 ID。

根据您的代码,我认为您的类仅用于生成新 ID。在这种情况下,您的类被用作实用程序类。所以你不想让它变得抽象。 Abstract 意味着“应该扩展”或者实用程序类不应该扩展,您可以将其设为 Final 以避免子类。

然后您希望存储 ID 列表并将其共享给所有人,这样您就不会重复使用这些 ID。所以你必须使其静态。每次调用 getId() 时重置变量 newId 后。所以你可以将其设置为该方法的本地方法。最后将该方法设为静态,这样它就不需要 IdHandler 实例,因此对于每个调用该方法的人来说都是相同的。

在这种情况下,我认为该方法可以重命名(以更明确地说明其作用)为 getNewId()

public final class IdHandler {

private static ArrayList<String> idList = new ArrayList<String>();

public static String getNewId() {
newId = "";
while (newId == "") {
newId = UUID.randomUUID().toString();

// if doesn't exist already , add to list, else empty String
if (!idList.contains(newId)) {
idList.add(newId);
break;
}
else
newId = "";
}
return newId;
}
}

并调用该方法:

public static void main() {
String myId = IdHandler.getNewId();
}
<小时/>

按照此编辑 comment :

如果你想为不同的对象使用不同的IdHandler。例如,您需要一个用于狗对象的 ID 处理程序和一个用于猫对象的 ID 处理程序。所以狗和猫可以有相同的 ID,这不是问题,因为它们不是同一类的实例。

您可以考虑为每个 IdHandler 创建简单的实例,但这不是最好的,因为您必须将引用传递给要创建新 ID 的任何地方的实例。

相反,您可以通过在类中创建一个引用 IdHandler 实例的静态字段,为每种类型的对象(即每个类)(即 Dog 中的一个和 Cat 中的一个)“隐藏”一个 IdHandler 实例。通过这样做,您将拥有每个类(狗或猫)的实例,并且您将直接从类访问它,因为它是静态的。

首先修改您的 IdHandler 类以不保留静态字段,因为您不希望它们在狗实例和猫实例之间共享。

公共(public)类 IdHandler {

    private ArrayList<String> idList = new ArrayList<String>();

public String getNewId() {
newId = "";
while (newId == "") {
newId = UUID.randomUUID().toString();

// if doesn't exist already , add to list, else empty String
if (!idList.contains(newId)) {
idList.add(newId);
break;
}
else
newId = "";
}
return newId;
}
}

然后在需要 ID 的类中添加一个静态字段来引用其 IdHandler 实例

Public class Dog {
public static final idHanlder = new IdHandler();

private final id;

public Dog(String id) {
this.id = id;
}

public String bark() {
return "waf!";
}
}

public class Cat {
public static final idHanlder = new IdHandler();

private final id;

public Cat(String id) {
this.id = id;
}

public String Meow() {
return "meow";
}
}

IdHandler 将在创建 Dog(或 Cat)类时创建,并将在 Dog(或 Cat)的所有实例之间共享。您可以直接从 Dog(或 Cat)类访问它。

public void main() {
String dogId1 = Dog.idHandler.getNewId();
Dog dog1 = new Dog(dogId1);
String dogId2 = Dog.idHandler.getNewId();
Dog dog2 = new Dog(dogId2);
String catId1 = Cat.idHandler.getNewId();
Cat cat1 = new Cat(catId1);
}

关于java - 处理特定项目的唯一 ID 的类 -> 是否抽象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49792804/

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