Java: 一个 UUID 生成单例
Java: An UUID generating Singleton
我正在做一个类似更简单的 Youtube 克隆的学校项目。我知道视频和播放列表 classes 的属性之一是字符串代码,我可以用任何我想要的方式生成它,只要它始终是唯一的。所以我很难使用 UUID(虽然我对它很陌生),而且视频和播放列表可以具有相同的代码,因为它们在我的代码中位于不同的库中,所以理论上我想要 2 UUID生成器,一个用于视频,一个用于播放列表,因此代码可以那样重叠。
我想做一个单例,这样生成器就不会比我需要的多,而且我总是可以保证我得到唯一的代码。这是我得到的。
import java.util.UUID;
public class CodeGenerator {
private static CodeGenerator singleInstance = null;
private UUID videoGen;
private UUID listGen;
private CodeGenerator() {
}
public static CodeGenerator getInstance() {
if (singleInstance == null)
singleInstance = new CodeGenerator();
return singleInstance;
}
public String getCodeVideo() {
return videoGen.randomUUID().toString();
}
public String getCodePlaylist() {
return listGen.randomUUID().toString();
}
}
但是 Eclipse 在我的两个 get 中都警告我,我应该将这个实例引用更改为静态引用,我从来都不擅长静态的东西,因为我想摆脱所有这些代码针对我的项目的警告,谁能告诉我一个可以满足我要求的修复方法?
P.S 我尝试使用两种不同的方法在测试 class 中生成一些代码,但结果总是不同,如预期的那样。代码运行良好,我可以看到,但我害怕它可能会给我带来问题。
问题与您的单例无关 - 这是因为您正在调用 UUID.randomUUID()
,这是一个静态方法,就好像它是一个实例方法一样。
这是一个较短的示例,我希望它给出相同的警告:
import java.util.UUID;
public class Test {
public static void main(String[] args) {
UUID ignored = null;
UUID generated = ignored.randomUUID();
}
}
从根本上说,您的字段毫无意义 - 无论如何您都不会为它们赋值。
我不清楚您是否期望 getCodeVideo()
在您的进程的生命周期中始终 return 相同的字符串。如果 是 情况,您应该将代码更改为:
import java.util.UUID;
public class CodeGenerator {
private static CodeGenerator singleInstance = new CodeGenerator();
private String video;
private String codePlayList;
private CodeGenerator() {
video = UUID.randomUUID().toString();
codePlayList = UUID.randomUUID().toString();
}
public static CodeGenerator getInstance() {
return singleInstance;
}
public String getCodeVideo() {
return video;
}
public String getCodePlayList() {
return codePlayList;
}
}
如果您真的想在每次调用该方法时生成一个新字符串,则不需要单例或类似的东西:
import java.util.UUID;
public class CodeGenerator {
public static String generateCode() {
return UUID.randomUUID().toString();
}
}
我正在做一个类似更简单的 Youtube 克隆的学校项目。我知道视频和播放列表 classes 的属性之一是字符串代码,我可以用任何我想要的方式生成它,只要它始终是唯一的。所以我很难使用 UUID(虽然我对它很陌生),而且视频和播放列表可以具有相同的代码,因为它们在我的代码中位于不同的库中,所以理论上我想要 2 UUID生成器,一个用于视频,一个用于播放列表,因此代码可以那样重叠。
我想做一个单例,这样生成器就不会比我需要的多,而且我总是可以保证我得到唯一的代码。这是我得到的。
import java.util.UUID;
public class CodeGenerator {
private static CodeGenerator singleInstance = null;
private UUID videoGen;
private UUID listGen;
private CodeGenerator() {
}
public static CodeGenerator getInstance() {
if (singleInstance == null)
singleInstance = new CodeGenerator();
return singleInstance;
}
public String getCodeVideo() {
return videoGen.randomUUID().toString();
}
public String getCodePlaylist() {
return listGen.randomUUID().toString();
}
}
但是 Eclipse 在我的两个 get 中都警告我,我应该将这个实例引用更改为静态引用,我从来都不擅长静态的东西,因为我想摆脱所有这些代码针对我的项目的警告,谁能告诉我一个可以满足我要求的修复方法?
P.S 我尝试使用两种不同的方法在测试 class 中生成一些代码,但结果总是不同,如预期的那样。代码运行良好,我可以看到,但我害怕它可能会给我带来问题。
问题与您的单例无关 - 这是因为您正在调用 UUID.randomUUID()
,这是一个静态方法,就好像它是一个实例方法一样。
这是一个较短的示例,我希望它给出相同的警告:
import java.util.UUID;
public class Test {
public static void main(String[] args) {
UUID ignored = null;
UUID generated = ignored.randomUUID();
}
}
从根本上说,您的字段毫无意义 - 无论如何您都不会为它们赋值。
我不清楚您是否期望 getCodeVideo()
在您的进程的生命周期中始终 return 相同的字符串。如果 是 情况,您应该将代码更改为:
import java.util.UUID;
public class CodeGenerator {
private static CodeGenerator singleInstance = new CodeGenerator();
private String video;
private String codePlayList;
private CodeGenerator() {
video = UUID.randomUUID().toString();
codePlayList = UUID.randomUUID().toString();
}
public static CodeGenerator getInstance() {
return singleInstance;
}
public String getCodeVideo() {
return video;
}
public String getCodePlayList() {
return codePlayList;
}
}
如果您真的想在每次调用该方法时生成一个新字符串,则不需要单例或类似的东西:
import java.util.UUID;
public class CodeGenerator {
public static String generateCode() {
return UUID.randomUUID().toString();
}
}