【问题标题】:realtime update an objects variables from hashmap of those variables从这些变量的哈希图中实时更新对象变量
【发布时间】:2015-05-30 20:23:05
【问题描述】:

这个问题可能是菜鸟级的,但我没有解决方案,所有 googleling 导致我更新哈希值,我已经知道了。

我正在制作一个角色扮演游戏,这个问题会影响所有有统计数据的东西(比如有addedStr, addedIQ, addedAgi 的装备类等等)。

为了简化更新过程,我在hashmap 中添加了所有这些变量,并通过以下方式更新hashmap

HashMap<String,Integer> statsHash = new HashMap<>();

void setStatsHash() {
  statsHash.put("addedCon", addedCon);
  statsHash.put("addedStr", addedStr);
  statsHash.put("addedAgi", addedAgi);
  ...
}

void changeStatsHash(String inStat, int inChange) {
  statsHash.put("addedCon", statsHash.get("addedCon") + 1);
  (this is an example, do not point out that inStat and inChange is dummy variables)
}

这很好用,我可以更新 `hashmapv.问题如下:

myEquipment.changeStatsHash("addedCon", 1);
myEquipment.printStatsHash();
System.out.println(myEquipment.addedCon);

当我这样做时,printStatsHash 表示 addedCon = whatever 它在 +1 之前。 但是myEquipment.addedCon没有变。

所以我的问题是这个,只有这个:

每次hashmap 中的变量发生变化时,如何从hashmap 更新“母亲”变量?

我希望hashmap 是原始对象的pointer,并且它们会一起更改,但似乎并非如此。

谢谢!

【问题讨论】:

  • 你能显示更多代码吗? “母变量”声明在哪里?
  • 这听起来有点像您使用反射 API 的东西。尽管从您的示例来看,我并不真正相信将变量存储在地图中的整个想法的有用性。这个更新过程是什么?地图如何简化它?
  • 正如我所说,如果您真的需要这个,请查看this。它正是为此目的而设计的。
  • myEquipment 是从 hashmap 派生的类的实例?如果你将它的代码添加到帖子中,它会使问题更清楚
  • “每次哈希图中的变量发生变化时,如何从哈希图中更新“母亲”变量? ...对于几乎所有编程问题(出于各种原因),反射应该始终是最后的解决方案。此类问题的首选方法是使用观察者模式。可观察对象将“通知”许多对象中的任何一个关于其状态的更改。此外,JavaFX 包括一个绑定 API,它可以单向或双向绑定属性值。观察者模式将提供比反射更强大的解决方案。

标签: java variables hashmap


【解决方案1】:

每次哈希图中的变量发生变化时,如何从哈希图中更新“母亲”变量?

地图包含与“母亲”变量不同的对象(我在这里假设您的意思是instance 变量),因此对其中一个的更改不会反映在另一个中(不清楚两者是否甚至是对象,或者是否实例变量是原语)。

要从任一位置(Mapinstance variable)更新值,请使两者都引用同一个对象。例如,您可以将值包装到它自己的类中:

public class IntWrapper{
    private int value;

    public void setValue(int val){ value = val;}
    public int getValue(){ return value;} 
    public void incrementValue(int inc){ setValue(value + inc);}
}
...

HashMap<String,IntWrapper> statsHash = new HashMap<>();
addedCon = new IntWrapper();
statsHash.put("addedCon", addedCon); 
...

void changeStatsHash(String inStat, int inChange) {
    statsHash.put("addedCon", statsHash.get("addedCon").incrementValue(1));
}

因为实例变量addedCon 和Map 中的实例变量都是同一个对象。话虽这么说,我不确定我是否掌握将值放在Map“简化过程”中。

【讨论】:

  • 我知道这是如何工作的,但是对于 100 多个不同的变量(玩家变量、怪物变量、设备变量、法术变量和大量不同的子类),我也看不出它会有什么帮助。如果这是最好的解决方案,我想我有两个选择: 1:停止使用哈希图并创建一个始终跟踪所有类类型的所有可用统计信息的类,以便我可以检查给定类是否具有该统计信息或 2:仅使用哈希图并忽略第一次更改时“母变量值”错误的事实?
【解决方案2】:

这可能是一个愚蠢的解决方案,但是:

我可以简单地让变量的所有交互都通过 switch 中的 hashmap 更改方法吗?添加一个检测器,将原始状态更改为相同的总和或更改相同的数量?

像这样:

switch(inStat)
case: "addedcon" {statsHash.put("addedCon", statsHash.get("addedCon") + inChange); addedCon = statsHash.get("addedCon"); break;

或者这个:

switch(inStat)
case: "addedcon" {statsHash.put("addedCon", statsHash.get("addedCon") + inChange); addedCon = addedCon + inChange; break;

这是可怕的编码吗?或者它会起作用吗? (或两者)。

【讨论】:

    猜你喜欢
    • 2013-03-21
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 2010-12-09
    相关资源
    最近更新 更多