【问题标题】:Java: An UUID generating SingletonJava:生成单例的 UUID
【发布时间】:2019-09-29 01:44:09
【问题描述】:

我正在开展一个类似于更简单的 Youtube 克隆的学校项目。我知道 Video 和 Playlist 类的属性之一是字符串代码,只要它始终是唯一的,我可以以任何我想要的方式生成它。所以我很难使用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 在我的两次获取中都警告我,我应该将此实例引用更改为静态引用,而我从来没有真正擅长静态的东西,因为我想摆脱所有这些代码警告我的项目,谁能告诉我一个解决我正在寻找的问题?

P.S 我尝试使用两种不同的方法在 Test 类中生成一些代码,但它们的结果总是不同的,如预期的那样。代码运行良好,我可以看到,但我很害怕它可能会给我带来问题。

【问题讨论】:

  • randomUUID() 是一个static 方法,在实例上调用它(你甚至没有正确初始化)没有意义。这就是 Eclipse 告诉你的。

标签: java random static singleton uuid


【解决方案1】:

问题与您的单例无关 - 这是因为您正在调用 UUID.randomUUID(),这是一个静态方法,就好像它是一个实例方法一样。

这是一个较短的示例,我希望它会给出相同的警告:

import java.util.UUID;

public class Test {
    public static void main(String[] args) {
        UUID ignored = null;
        UUID generated = ignored.randomUUID();
    }
}

从根本上说,您的字段毫无意义 - 无论如何您永远不会为它们分配值。

我不清楚您是否希望 getCodeVideo() 在您的进程的整个生命周期内始终返回相同的字符串。如果 是 的情况,您应该将代码更改为:

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();
    }

}

【讨论】:

  • 我希望每次调用 getCodeVideo() 返回不同的字符串,但我也希望 getCodePlaylist() 能够返回由 getCodeVideo() 返回的字符串。
  • 所以即使有 2 个 UUID,我也不能得到两组代码可以这么说吗?没什么大不了的,只要代码始终是唯一的,代码就可以工作,但我有点想拥有两组代码。
  • @Catralitos 有两个电话很好 - 但你会看到你在每个电话中都做同样的事情 - 差异为零 - (目前)这只是与开发人员沟通的问题(和一个可扩展点)。当然,您可以预先/附加一个“c”/“v”来指示视频或播放列表,这可能作为一个简单的视觉指示器很有用。
猜你喜欢
  • 2017-06-25
  • 2016-10-23
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 2021-06-24
相关资源
最近更新 更多