【问题标题】:How to clean similar code [closed]如何清理类似的代码[关闭]
【发布时间】:2013-06-26 18:07:55
【问题描述】:

我想对系统中的数据进行深拷贝。我有这样的课:

Class User{
    User mother;
    User father;
    User spouse;
}

创建单个记录后,我想像这样重建它们的引用:

Map<User, User> motherMap = new HashMap<User, User>();
Map<User, User> fatherMap = ...;
Map<User, User> spouseMap = ...;

//Now I want to populate User reference like this:
for(User user : motherMap.keySet) {
    //some other similar code;
    user.setMother(motherMap.get(user));
} 
for(User user : fatherMap.keySet) {
    //some other similar code;
    user.setFather(fatherMap.get(user));
}
for(User user : motherMap.keySet) {
    //some other similar code;
    user.setSpouse(spouseMap.get(user));
}

知道如何清理这种类似的代码吗?我想让我的代码更好,因为在实际代码中,用户之间有超过 10 个引用。 Intellij 警告这种方法分析起来太复杂了,感觉只会复制粘贴……

【问题讨论】:

  • 你想达到什么目的?一些描述会很好
  • 哪个是“主”数据集?是 User 的实例在控制,三个 Map 是从它们派生的,还是 Map 在控制,User 实例是从 Map 派生的?在您的示例代码中,您似乎在后面做,但需要更多解释。顺便说一句,我认为“控制”地图是一个可疑的想法。
  • 我同意根据示例代码不清楚。 伪代码 似乎创建 映射的事实令人困惑。这有点暗示代码应该填充地图,但常识表明我们正在尝试填充 User 对象。
  • 我想做一个来自其他系统的用户的深拷贝。首先,我创建了不参考其他用户的用户,并将他们的关系存储在地图中。然后在我坚持它们之后,我想从这些地图中重建它们的关系。

标签: java coding-style


【解决方案1】:

您可以这样做以从所有地图中创建一组所有键:

Set<User> allUsers = new HashSet<User>();

allUsers.addAll(motherMap.keySet());
allUsers.addAll(fatherMap.keySet());
allUsers.addAll(spouseMap.keySet());

for (User u : allUsers) {
    u.setMother(motherMap.get(u));
    u.setFather(fatherMap.get(u));
    u.setSpouse(spouseMap.get(u));
}

【讨论】:

  • 谢谢大家。我最终决定使用反射来更新这些字段。
【解决方案2】:

您是否尝试过使用过滤类

instance of

【讨论】:

  • 嗯?你在说什么?
  • 几天前我遇到了类似的问题。有几个子类,需要知道哪个子类用于使用正确的命令。到时候我发现如果你正在处理子类,操作符的实例大多被遗忘
  • 这个问题与instanceof无关。它将用于区分哪些类和/或子类?
  • 都是 User 对象。
  • 另外,instanceof 是一个词...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 2011-06-20
  • 2021-04-24
相关资源
最近更新 更多