gpt4 book ai didi

Java,当我将我的用户放入 map 时,它不起作用

转载 作者:行者123 更新时间:2023-11-30 06:41:31 25 4
gpt4 key购买 nike

我正在为 minecraft 服务器、代理和 spigot 开发两个 api,当玩家连接时,代理 API 在数据库中获取玩家,然后将其发送到 redis,然后 api spigot 将寻找redis 上的播放器,并将其保存在 map 中,这就是问题所在,我有一个像这样的“User#get”方法:

public static User get(UUID uuid) {
return users.getOrDefault(uuid, fetchUser(uuid));
}

还有像这样的“User#fetchUser”:

private static User fetchUser(UUID uuid) {
return Main.instance.getRedisAPI().get(uuid.toString(), User.class);
}

redis的key是播放器的uuid,value是JSON序列化的用户类,api为Gson我最近知道 Gson 为了反序列化,创建了他自己的空构造函数,并通过反射填充了字段,这是我不想要的,因为正是在我的构造函数中,我将 User 放入了映射中。所以我创建了自己的 TypeAdapter 来实现 JsonDeserializer,以便运行构造函数。它有效,构造函数执行得很好,但用户没有放在 map 中!所以每次我创建 User#get 时,它都会运行 fetchUser,但最终会因为请求太多而崩溃。我将我的类(class)放在一个 pastebin 中供您观看。 (抱歉,如果这不是方法,这是我第一次在 stackoverflow 上发帖,对不起我的英语,我是法语,我使用谷歌翻译)

用户.java > https://pastebin.com/4ta4XDqX
RedisAPI.java > https://pastebin.com/GjWPUf4m
Serializer.java > https://pastebin.com/k6g1KYYF
UserDeserializer.java > https://pastebin.com/0LF7trSR

提前谢谢你。

最佳答案

Map::getOrDefault做:

Returns the value to which the specified key is mapped, or defaultValue if this map contains no mapping for the key.

因此,它根本不会为 map 添加任何值。您还总是急切地执行 User::fetchUser 方法,无论 UUID 是否存在于 map 中。

听起来你需要Map::computeIfAbsent相反,它:

If the specified key is not already associated with a value (or is mapped to null), attempts to compute its value using the given mapping function and enters it into this map unless null.

public static User get(UUID uuid) {
return users.computeIfAbsent(uuid, User::fetchUser);
}

User::fetchUser 只有在 UUID 尚未在 map 中找到时才会执行。

关于Java,当我将我的用户放入 map 时,它不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55313650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com