我有一个物品对象工厂,他引用了所有的物品对象,一个玩家可以持有多个相同的物品。为了唯一标识一个物品,这里我采用运行时变量。这个唯一标识只是针对于物品来说,假如是另一个对象,则可以和物品的运行时id相同,所以我觉得这里不需要采用UUID我是这么做的
public synchronized String getRunTimeId() {
if(runTimeId != Long.MAX_VALUE) {
runTimeId += 1;
} else {
runTimeId = 0;
}
return runTimeId + "";
}
但是我担心一件事情,就是对象工厂中的对象太多,有没有可以同时存在两个runTimeId=0的对象。同样还有一件事,对于匿名登录用户通常用怎样的运行时变量来唯一标识
public synchronized String getRunTimeId() {
if(runTimeId != Long.MAX_VALUE) {
runTimeId += 1;
} else {
runTimeId = 0;
}
return runTimeId + "";
}
但是我担心一件事情,就是对象工厂中的对象太多,有没有可以同时存在两个runTimeId=0的对象。同样还有一件事,对于匿名登录用户通常用怎样的运行时变量来唯一标识
Long runTimeId = 0l, runTimeId2 = 0l; public synchronized String getRunTimeId()
{
Long uniqueId = (runTimeId == Long.MAX_VALUE) ? --runTimeId2: --runTimeId; return uniqueId.toString();
}
如果这样的话这个唯一标识如果到最小值就又不行了
你要确保你的唯一ID总数是Long的长度范围的2倍之内才行!
如:System.currentTimeMillis() + 静态变量的值,字符串拼接1285059333671 + 9 -->12850593336719
物品的存储我是以集合的形式存在用户和场景中,不会单独存储。
所以id的生成我用不到数据库,有用Java实现的方式吗?
系统重启后,创建原来的物品时会重新分配一个运行时id给这个物品。我只要求在运行环境中没有物品的运行时标识是重复的
□ □
■ 忍以明志 勤以致远 ■
□ □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
当long再次变成0时,以前的runTimerId=0的物品还没有被工厂释放,这个时候就可能出现两个相同的运行时id,不过我不知道虚拟机能支持Long.MaxValue个对象吗?如果不支持的话,我的担忧就是多余的
□ □
■ 忍以明志 勤以致远 ■
□ □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
□ □
■ 忍以明志 勤以致远 ■
□ □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)