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

时间:2013-10-25 12:45:43

标签: java

我需要使用可通过循环轻松获得的命名模式来创建大量对象。有没有办法从变量中读取对象名称,比如这个?

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

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

3 个答案:

答案 0 :(得分:20)

您选择的单词表明您并不完全理解变量和对象的工作方式,您需要修复它以便随处获取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!

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

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

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

 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<String,Cell> myMap = new TreeMap<String,Cell>();

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(...));
   }
}

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

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书籍中集合API 的章节。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

示例:

Map<String, Object> map = new HashMap<String, Object>();

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

然后可以检索它:

Object obj = map.get(objectName);