我正在尝试处理游戏的 Controller (例如分屏游戏,许多 Controller ,一个屏幕/游戏),但不知何故我不知道执行此操作的最佳实践是什么?目前,我正在尝试通过套接字的 IP 地址来命令 Player 对象,以便每个 Controller 控制右侧的 Player,但不知何故,我将相同的 IP 绑定(bind)到多个 Player(通过引用复制错误?):
public class PlayerMapper {
public static final Logger LOGGER = LogManager.getLogger(PlayerMapper.class.getName());
private static final Map<byte[], Player> players = new HashMap<>();
public static synchronized Player getPlayer(final InetAddress paramInetAddress) {
return players.get(paramInetAddress.getAddress());
}
public static synchronized void addPlayer(final InetAddress paramInetAddress, final String paramName) {
final byte[] address = paramInetAddress.getAddress();
final Player player = players.get(address);
if (null == player) {
players.put(address, new Player(paramName));
} else {
LOGGER.debug("Player \"{}\" already connected!", player.getName());
}
}
}
使用相同的“ Controller ”又名“127.0.0.1”测试 5 次,结果是 5 个不同的玩家,HashMap 中键的值都是相同的,但引用不同,即使我复制字节IP 地址数组?
最佳答案
数组继承了默认的对象hashCode()
和equals()
方法。 Object#hashCode()
从对象的内存地址生成哈希码,Object#equals()
仅比较对象标识(它们是否是同一对象)。
因此,即使两个数组具有相同的内容,它们也会被视为 HashMap
中不同的键。要将数组用作 HashMap
键,您必须将它们包装在一个对象中并提供自定义 hashCode()
和 equals()
实现。
关于Java Socket - 将对象绑定(bind)到 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34143645/