Java,当我把我的用户放在地图上时,它';它不工作了

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

我正在为minecraft服务器开发两个api,一个代理和一个插口,当一个玩家连接时,代理api在数据库中获取该玩家,然后将其发送到redis,然后api插口将在redis上查找该玩家,并将其保存在地图中,这就是问题所在,我有一个“User#get”方法,如下所示:

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
方法,该方法也会将用户放入地图中。