使用字符串值创建变量名

19

这是一个简单的问题(我认为)

假设我有这段代码(假设我有一个Dog类)

String name = "dog";
dog name = new dog();

我该如何让Java将"name"识别为字符串并将对象命名为"dog"?


3
你为什么想要这样做?肯定有更好的方法来实现你想做的事情。 - Telmo Marques
1
如果您想要了解Java的反射API,那么您可能应该学习一下。 - fge
我认为这个问题的标题和内容不一致。看起来你并不是想创建一个变量,其名称基于字符串的值。相反,你似乎想根据字符串值设置变量的类。如果是后者,那么“工厂”模式可能会有所帮助。 - Kavka
@fge:我认为我们需要更多地了解他为什么想这样做。我的经验是,在这里,反射不是解决帖子作者试图解决的整体问题的解决方案,这种情况占到了90%以上。 - Hovercraft Full Of Eels
2个回答

48

虽然在一些脚本语言(如PHP)中可以实现您尝试的操作(这也是许多开始使用Java的PHP程序员经常问的问题),但这并不是Java的工作方式,事实上,变量名称要比您意识到的要不重要得多,并且在代码编译后几乎不存在。更重要的是变量引用,也就是在程序的特定点获得访问特定对象的能力,您可以通过使用Map等方式使字符串轻松地引用对象。

例如:

Map<String, Dog> dogMap = new HashMap<String, Dog>();
dogMap.put("Fido", new Dog("Fido"));

Dog myPet = dogMap.get("Fido");
或者您可以通过数组、ArrayLists、LinkedLists或其他几个集合方式获得对象的引用。
编辑: 您说:
“问题在于,我将使用一种方法来创建对象,在这种情况下对象的名称是任意的,但我需要它是动态的,因为它不会是临时的,所以实际上对象的名称必须更改,否则我将覆盖先前声明的对象。”
这正是我所说的变量名并不像您想象的那样重要的原因。变量名不是“对象名称”(实际上这根本不存在)。
例如,如果您在名为Fido的变量中创建了一只狗,并将其分配给名为spot的新变量,则尽管具有不同名称,但两个变量将指向完全相同的对象:
Dog fido = new Dog;
Dog spot = fido; // now fido and spot refer to the same object
如果你想要给一个变量“命名”,考虑给类添加一个名称属性:
class Dog {
   private String name;

   public Dog(String name) {
      this.name = name;
   }

   public String getName() {
      return name;
   }
}

如果您希望的话,现在您可以为每个 Dog 对象赋予一个(半)唯一的名称。


问题在于我的代码中我将使用一个方法来创建对象,对象的名称是任意的,但我需要它是动态的,因为它不会是临时的,所以对象的实际名称必须更改,否则我将覆盖先前声明的对象。 - charles horvath
好的,这个答案中描述的方法可以让你做到这一点! - Zéychin
我正在尝试让它工作,大约三十分钟后我会回来告诉你进展如何。 - charles horvath
一切都很顺利!我弄清楚了如何使用HashMap来映射对象的引用。非常感谢。 - charles horvath
我知道这已经很老了@HovercraftFullOfEels,但我希望你能看到这个问题。如果HashMap中有两个不同的键值对和两个不同的实例怎么办?比如说map.put("Cat", new Cat()),你该如何声明HashMap?是HashMap<String, Object>吗?如何实例化这个类? - bretonics
显示剩余2条评论

6

我猜你在考虑枚举类型(Enums)吧?

private static void test () {
  Animal animal = Animal.valueOf("Dog");
}

enum Animal {
  Dog,
  Cat,
  Cow,
  Pig,
  Rat,
  Ant,
  Gnu;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接