如何用变量定义java对象名?

我需要使用通过循环容易获得的命名模式来创建大量对象。 有没有办法从变量读取对象名称,像这样?

String Var = "ObjectName"; ClassName Var = new ClassName(); 

我不需要为对象分配变量名,只是为了在赋值时从中获取名称。

您选择的单词表明您并不完全理解变量和对象的工作方式,您需要修复它以获得Java的任何位置。

如果我写:

 Item myItem = new Item(); 

我创建了一个新对象, 定义了一个指向该对象的变量。

该对象没有名称 (它有一个ID,它是在运行时分配的数字;大多数程序员可以忽略它)。

该变量的名称为myItem 。 变量指向对象。 稍后,它可能指向另一个对象。 变量可能超出范围并且不再存在,而对象继续存在。

你可能会说,“这并不重要。如果我说’对象的名字’,我的意思是’指向对象的变量名’。”

但这很重要,因为许多对象将由多个变量指向:

 Item myItem = new Item(); Item yourItem = myItem; // both variables point to the same object. Neither variable is "more" the // owner of the object than the other. 

……并且变量不会直接指向许多对象。

 myList.append(new Item()); // you can't get at this new object using a direct variable. 

在Java(以及大多数主流语言)中,您无法在运行时创建变量名称。 唯一存在的变量名称是字面上在源代码中的变量名称

所以没有什么能像这样工作:

 int number = 1; Cell cell$number = new Cell(); // can't be done! Cell currentCell = cell1; 

您也不能根据运行时数据按名称访问变量。 所以没有什么能像这样工作:

 Cell cell1 = ...; int number = 1; Cell currentCell = cell$number; // can't be done! 

这是一件好事,因为它可以让编译器validation有关代码的某些内容。

在某些语言中,您可以使用eval()实现类似的function – 但是您应该从中跑出一英里!

这是一个提示,如果您正在编写如下代码:

  Cell cell0 = new Cell(...); Cell cell1 = new Cell(...); ... Cell cell99 = new Cell(...); 

……然后你做错了什么。 它可能会起作用,但它会严重缩放。 没有办法将它放入循环中。 (别担心 – 我们大多数人在开始编程时遇到了这个问题)。

如果,你使用了一个数组:

  Cell[] cells = new Cell[]; cells[0] = new Cell(...); cells[1] = new Cell(...); ... cells[99] = new Cell(...); 

然后你可以使用循环代替:

  for(int i = 0; i<100; i++) { cells[i] = new Cell(...); } 

数组是最简单的“集合”对象。 还有集合,列表,地图和一系列更高级的集合,以满足大多数需求。

您似乎想要使用字符串作为键来存储和访问对象。 这样做的方法是使用Map。

 Map myMap = new TreeMap(); myMap.put("AA", new Cell(...)); myMap.put("AB", new Cell(...)); ... Cell currentCell = myMap.get("AA"); 

Map是一个界面TreeMap只是一个提供Map接口实现的类。 阅读标准JRE提供的各种Map实现。

密钥不必是String 。 任何实现equals()都可以用作键。

使用这个:

 for(char c = 'A'; c <= 'L'; c++) { for(char d = 'A'; d<= 'L'; d++) { myMap.put("" + c + d, new Cell(...)); } } 

但是,由于您已经说过想要一个网格,因此最好使用二维数组,并在需要时将数字坐标转换为字母网格引用。 谷歌的“2DarraysJava”,你会发现很多例子。

 Cell[][] cells = new Cell[12][12]; for(int x=0; x<12; x++) { for(int y=0; y<12; y++) { Cell cell = new Cell(); cell.setName( "" + ('A' + x) + ('A' + y)); // perhaps cells[x][y] = cell; } } 

除了标准的JRE之外,还有很多其他的Map实现。 例如,Spring提供DefaultRedisMap,其中对象存储在Redis数据库中。

更一般地说 - 你在这里问了一个非常基本的问题。 您应该阅读任何体面的Java书籍中关于Collections API的章节。

它根本不清楚你想要什么。 如果要按名称查找对象,可以使用Map

例:

 Map map = new HashMap(); String objectName = ...// get name of object Object object = ...// get object map.put(objectName, object); 

然后它可以检索:

 Object obj = map.get(objectName); 

容易获得? 你看过Arrays了吗? 如果你想使用字符串,那么字符串数组就足够了,还有char和int数组。

  String[] myStringArray = new String{"hello", "world"}; int[] myIntArray = new int{1, 2, 3, 6}; 

我建议你阅读arrays及其用途,我相信它可以解决你的问题。