Java,当我把我的用户放在地图上时,它';它不工作了
我正在为minecraft服务器开发两个api,一个代理和一个插口,当一个玩家连接时,代理api在数据库中获取该玩家,然后将其发送到redis,然后api插口将在redis上查找该玩家,并将其保存在地图中,这就是问题所在,我有一个“User#get”方法,如下所示:Java,当我把我的用户放在地图上时,它';它不工作了,java,dictionary,hashmap,gson,Java,Dictionary,Hashmap,Gson,我正在为minecraft服务器开发两个api,一个代理和一个插口,当一个玩家连接时,代理api在数据库中获取该玩家,然后将其发送到redis,然后api插口将在redis上查找该玩家,并将其保存在地图中,这就是问题所在,我有一个“User#get”方法,如下所示: public static User get(UUID uuid) { return users.getOrDefault(uuid, fetchUser(uuid)); } 还有这样的“用户#fetchUser”: pu
public static User get(UUID uuid) {
return users.getOrDefault(uuid, fetchUser(uuid));
}
还有这样的“用户#fetchUser”:
public static User get(UUID uuid) {
return users.getOrDefault(uuid, fetchUser(uuid));
}
私有静态用户fetchUser(UUID UUID){
返回Main.instance.getRedisAPI().get(uuid.toString(),User.class);
}
键redis是播放器的uuid,值是用JSON序列化的用户类,带有api Gson
我最近知道,为了反序列化,Gson创建了自己的空构造函数,并通过反射填充字段,这是我不想要的,因为在我的构造函数中,我将用户放在映射中。所以我创建了自己的TypeAdapter来实现JsonDeserializer,以便运行构造函数。它可以工作,构造函数执行得很好,但是用户没有被放到映射中!因此,每次我让一个用户#get时,它都会运行fetchUser,结果由于请求太多而崩溃。我把我的课程放在一个垃圾箱里让你看。(对不起,如果不是这样做的话,这是我第一次在stackoverflow上发帖,对不起我的英语,我是法国人,我使用谷歌翻译)
User.java>RedisAPI.java>
Serializer.java>
UserDeserializer.java> 提前感谢您。是否: 返回指定键映射到的值,如果此映射不包含该键的映射,则返回defaultValue 因此,它根本不会给地图增加任何价值。您还总是急切地执行
User::fetchUser
方法,不管UUID
是否存在于映射中
听起来你需要的是:
如果指定的键尚未与值关联(或映射为null),则尝试使用给定的映射函数计算其值,并将其输入此映射,除非为null
i、 e
其中
User::fetchUser
仅在映射中未找到UUID
时执行。请在问题中编辑说明问题所需的最小代码。我在用户构造函数的映射中添加了我的用户,因此,如果我执行users.getOrDefault,它将返回映射中的用户,如果用户不在映射中,它将执行fetchUser,fetch用户将执行构造函数,在构造函数中,我将用户放在映射中,你可以看到它un User.java,问题是:构造函数的Map::put不起作用。@OpperDev用户是否在映射中并不重要!在users.getOrDefault
可以调用之前,Java必须确定该方法的两个参数的值。第二个参数值是fetchUser(uuid)
的结果。所以Java总是(无条件地)调用fetchUser(uuid)
@OpperDev我明白你的意思。使用putIfAbsent
方法,您也可以从构造函数中删除put
调用?在我的get方法中,我将返回users.containsKey(uuid)?get(uuid):fetchUser(uuid)
?@OpperDev确切地说,使用putIfAbsent
,只有当用户缺席时才会调用fetchUser
方法,该方法也会将用户放入地图中。