Java 类处理特定项目的唯一ID->;抽象与否?
我对编程相当陌生,尤其是OOP概念。我创建了一个类,该类应该处理其他类对象的唯一ID。我只想给构造函数中的对象分配一个唯一的ID 我不知道Java 类处理特定项目的唯一ID->;抽象与否?,java,object,abstract,Java,Object,Abstract,我对编程相当陌生,尤其是OOP概念。我创建了一个类,该类应该处理其他类对象的唯一ID。我只想给构造函数中的对象分配一个唯一的ID 我不知道IdHandler类是否应该是抽象的。据我所知,如果我需要不同的ID名称空间(可能是不同的仓库),我需要为每个ID创建一个IdHandler对象?我在哪里创建这些对象?在主类的开头或定义名称空间的构造函数中(例如Warehouse()) 这是ID类-> public class IdHandler { private String newId;
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;
}
}
公共类IdHandler{
私有字符串newId;
private ArrayList idList=new ArrayList();
公共字符串getId(){
this.newId=“”;
而(this.newId==“”){
this.newId=UUID.randomUUID().toString();
//如果不存在,则添加到列表,否则为空字符串
如果(!this.idList.contains(this.newId)){
this.idList.add(this.newId);
打破
}
其他的
this.newId=“”;
}
返回此.newId;
}
}
发现不清楚您的类是应该持有对象的ID,还是用来生成对象将持有自身的唯一ID
根据您的代码,我假设您的类仅用于生成新ID。在本例中,您的类用作实用程序类。所以你不想把它抽象化。抽象意味着“应该扩展”或者不应该扩展实用程序类,您可以将其设置为final以避免子类
然后,您希望将ID列表存储并共享给每个人,这样就不会重用ID。所以你必须让它静止。变量newId在每次调用getId()时重置之后。因此,您可以使其成为该方法的局部。最后,将该方法设为静态,这样它就不需要IdHandler的实例,因此调用该方法的每个人都可以使用相同的实例
在这种情况下,我认为可以将该方法重命名为getNewId()
编辑以下内容: 如果您想为不同的对象使用不同的IdHandler。例如,您需要一个用于dog对象的ID处理程序和一个用于cat对象的ID处理程序。所以狗和猫可以有相同的ID,这不是问题,因为它们不是同一类的实例 您可以考虑为每个实例创建IdHandler的简单实例,但这并不是最好的,因为您必须将引用传递到要创建新ID的任何地方 相反,您可以通过在类中创建一个引用IdHandler实例的静态字段来“隐藏”每种类型对象(换句话说,每个类)的IdHandler实例,一个在Dog中,一个在Cat中。通过这样做,您将为每个类(狗或猫)创建一个实例,并且您将直接从类访问它,因为它是静态的 首先修改IdHandler类以不保留静态字段,因为您不希望它们在dog实例和cat实例之间共享 公共类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;
}
}
IdHandler将在创建类Dog(或Cat)时创建,并在Dog(或Cat)的所有实例之间共享。您可以直接从类Dog(或Cat)访问它
这取决于你是否想实例化你的类。 对于像IdHandler这样的类,抽象是没有意义的 抽象类的思想是,它们定义了继承类可以使用的公共字段和方法,但不应单独实例化 但是如果您使用的是UUID,那么您的整个IdHandler都是多余的。让一个类来处理ID生成是一个好主意。但是实际上没有必要将它们保存到列表中或检查它们是否在该列表中(顺便说一句,这不是理想的数据结构,因为查找速度很慢,最好使用哈希集) UUID背后的理念是,当你生成一个UUID时,它是独一无二的。理论上有发生碰撞的可能性,但几率非常小,因此更有可能被陨石击中 此外,如果发生冲突,为什么要返回空字符串?如果发生冲突(很可能永远不会发生),您可能希望知道并抛出异常 所以我给你的建议是:
public class IdGenerator {
public static String generateId() {
return UUID.randomUUID().toString();
}
}
如果它是抽象的,您将无法实例化它。如果您只想从它继承,那么这没关系,但在您的问题中没有这方面的指示。感谢您的回答。是的,计划是创建特定项目的多个对象(在本例中为装运集装箱)每个对象都应该存储它从IdHandler获得的唯一ID。我关心的是,比方说,我想扩展我的项目并创建另一种类型的对象,其名称空间为UniqueID。据我所知,我必须创建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;
}
}
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";
}
}
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);
}
public class IdGenerator {
public static String generateId() {
return UUID.randomUUID().toString();
}
}