【问题标题】:Java: Getting object associated with enumJava:获取与枚举关联的对象
【发布时间】:2015-05-16 11:49:26
【问题描述】:

我有一个充满自定义对象的 ArrayList。我需要将此 ArrayList 保存到一个 Bundle 中,然后再检索它。

Serializable 和 Parcelable 都失败了,我现在只是尝试以某种方式保存与 ArrayList 中的索引关联的对象,然后在恢复 Bundle 并重新添加对象时检查这些对象。

我所拥有的是这样的:

保存捆绑包时:

    //Create temporary array of the same length as my ArrayList
    String [] tempStringArray = new String[myList.size()];

    //Convert the enum to a string and save it in the temporary array
    for (int i = 0; i<myList.size();i++){
                tempStringArray [i] = myList.get(i).getType();  //returns the enum in string form
    }

    //Write this to the Bundle
    bundle.putStringArray("List", tempStringArray);

所以我现在有一个字符串数组,表示最初在 ArrayList 中的对象的枚举类型。

所以,当恢复 Bundle 时,我正在尝试的是这样的:

//Temporary string array
String[] tempStringArray = savedState.getStringArray("List");

//Temporary enum array
ObjectType[] tempEnumArray = new ObjectType[tempStringArray.length];

for (int i = 0; i<tempStringArray.length;i++){
    tempEnumArray[i]=ObjectType.valueOf(tempEnemies[i]);
}

所以,现在我有了最初在 ArrayList 中的每个项目的枚举类型。

我现在正在尝试做的事情类似于(将进入上面的 for 循环):

myList.add(tempEnumArray[i].ObjectTypeThisEnumRefersTo());

显然,上面的“ObjectTypeThisEnumRefersTo()”方法不存在,但这最终是我想要找出的。这是可能的还是有其他方法可以做到这一点?

【问题讨论】:

  • 您是在谈论 Java 枚举,还是更广泛意义上的“枚举”? myList 最初持有什么样的对象?
  • 嗨@JHH,我在这里询问Java 枚举。原始数组列表包含自定义对象(在我的情况下,它们是“敌人”类型的对象,因为这是一个游戏)希望这会有所帮助。
  • 所以,如果我有误解,请原谅我,myList 是否保存一个名为 Enemy 的单个枚举的不同值?你想从字符串重新创建枚举 values 吗?因为一开始我以为你有不同类的对象,需要确定类。如果您需要它们各自字符串中的值,Enemy.valueOf(String) 是您的朋友。
  • 不@JHH,列表中的所有对象都是'Enemy'类的实例 - 所以我会这样做:bee = new Enemy(EnemyType.Bee);然后 spider = new Enemy(EnemyType.spider);因此,我需要添加保存 Bundle 时的项目 - 所以 myList.add(bee)、myList.add(spider)。但显然必须按照原来的顺序返回。希望这是有道理的!

标签: java android enums bundle value-of


【解决方案1】:

要从字符串中获取枚举类型 Enemy 的枚举值,请使用

Enemy.valueOf(String).

Enemy.valueOf("SPIDER") 将返回 Enemy.SPIDER,前提是您的枚举看起来像

enum Enemy { SPIDER,  BEE};

编辑:事实证明 Zippy 也有一组固定的 Enemy 对象,每个都映射到 EnemyType 的每个值,并且需要一种从给定 EnemyType 中找到 Enemy 的方法。我的建议是创建一个

HashMap<EnemyType, Enemy> 

并在创建时将所有对象放入其中,然后在反序列化时使用 hashmap 将字符串转换为枚举值并将枚举值转换为 Enemy 对象。

我后来想到,根据你在 Enemy 中有多少逻辑,你可能需要考虑废弃 Enemy 或 EnemyType 并将它们组合成一个参数化枚举,类似于此处的 Planet 示例:http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html 这将使您不必从字符串到最终对象的两个步骤,并简化一些事情,因为您根本不需要任何哈希图。

【讨论】:

  • 嗨@JHH,我已经在这样做了(你可以在上面的for循环中看到),然后我不能说这样的话。 myList.add[Enemy.valueOf(String)];因为 arrayList myList 需要一个“Enemy”类型的对象,而不是一个枚举。抱歉,如果我不清楚解释我所追求的。因此,在设法恢复枚举之后,我现在需要获取最初与枚举关联的对象,以便将其添加回 ArrayList,:-)
  • 换句话说,我需要一种说法'如果这个枚举是 Bee,那么 myList.add(bee);'或'如果这个枚举是蜘蛛,那么 myList.add(spider);' - 我可以使用 switch 语句来做到这一点,但这不会那么好。
  • 我现在真的很困惑。 :-) 所以,Enemy 实际上不是 enu,EnemyType 是。 Enemy 是一个普通类,具有对 EnemyType 值的引用。在上面的示例中,您说您创建了 Enemy 对象,例如 bee = new Enemy(EnemyType.BEE)。 Enemy 现在是否拥有比此参考更多的数据?你需要 Enemy 类来包装你的枚举值吗?你不能简单地通过 new Enemy(EnemyType.valueOf(String) 重新创建你的 Enemy 对象吗?
  • 我不确定开关会有什么帮助,因为我假设您在存储到捆绑包之前创建的对象(蜜蜂、蜘蛛......)不再存在?您不只是想创建新的等效对象吗?
  • 很高兴它成功了。我更新了我的答案,还添加了一个额外的想法。
猜你喜欢
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 2016-08-02
  • 1970-01-01
  • 2016-04-24
相关资源
最近更新 更多