gpt4 book ai didi

java - 替换重复的 java 对象,包括所有引用

转载 作者:行者123 更新时间:2023-11-30 08:26:27 25 4
gpt4 key购买 nike

我知道我们已经有关于 replacement of object instances 的问题,答案总是:即使可以,也永远不要这样做,这是黑魔法,但我不确定如何解决我的问题,所以让我解释一下......

我正在解析有关某些车辆及其特定模块的数据以存储在数据库中(这是关于游戏的)。每个 Vehicle 都有许多 ComaptibleModules 的数据:

class Vehicle {
String id;
// other stuff...
CompatibleModules modules;
}

ComaptibleModules 在复杂的安排(依赖项和内容)中包含许多 Module 类(例如 Engine extends Module)的对象.

class CompatibleModules {
Engine defaultEngine;
List<Engine> compatibleEngines;
// other stuff...
}

在此类中多次引用相同的 Module 是可以预料的。

我只是在每辆车的基础上获取数据,所以即使一些车辆共享相同的模块(他们这样做,过度),我正在编写一个新的 Module 对象每辆车。完成解析后,我想通过删除重复项并单独存储模块来优化数据库,因此车辆仅通过 ID 引用模块。

这就是问题开始的地方:我可以轻松地从每个 VehicleCompatibleModules 结构中获取所有 Module,存储它们在 HashSet 中,从而检测冲突。但是在我检测到碰撞之后,将 CompatibleModules 中重复项的所有引用替换为原始引用并不是一项简单的任务。

在这种情况下,替换所有重复引用的优雅方法是什么?

最佳答案

不要再将模块视为车辆的一部分,而应将它们视为用于制造车辆的独立部件。

所以你想有一个工厂来管理可用的模块,当你制造车辆时,你向工厂询问必要的模块。然后工厂确保每个模块“类型”或“实例”在整个系统中只存在一次。

[编辑] 一种解决方案是替换 List<Engine> compatibleEnginesSet<Engine> compatibleEngines = new LinkedHashSet<>(); . LinkedHashSet保留插入顺序。进行此更改后,您可以简单地添加模块,它们将相互覆盖。

注意:要使其正常工作,您必须覆盖 equals()hashCode() .

如果你不能这样做,那么创建一个包装器对象,它有一个很好的 equals()hashCode() .要清除重复项:

Set<Wrapper> wrappedEngines = new LinkedHashSet<>();    
for( Engine e : compatibleEngines ) {
wrappedEngines.add( new Wrapper( e ) );
}
compatibleEngines.clear();
for( Wrapper e : wrappedEngines ) {
compatibleEngines.add( e.getDelegate() );
}

关于java - 替换重复的 java 对象,包括所有引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21481551/

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