如何使用变量定义Java对象名称?

我需要使用可以通过循环轻松获得的命名模式来创建大量对象。有什么办法可以像这样从变量中读取对象名称?

String Var = "ObjectName";

ClassName Var = new ClassName();

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

回答:

您所选择的单词表明您不完全了解变量和对象的工作方式,因此您需要对其进行修复以使其在Java中得到广泛应用。

如果我写:

Item myItem = new Item();

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

该对象 没有名称 (它具有一个ID,该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<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接口实现的一类。阅读有关Map标准JRE提供的各种实现的信息。

钥匙不一定是String。任何实现的工具equals()都可以用作键。

使用这个:

for(char c = 'A'; c <= 'L'; c++) {

for(char d = 'A'; d<= 'L'; d++) {

myMap.put("" + c + d, new Cell(...));

}

}

但是,由于您已经说过要使用网格,因此最好使用2D数组,并在需要时在带字母的网格引用之间来回转换数字坐标。Google的“

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书籍中阅读有关 的章节。

以上是 如何使用变量定义Java对象名称? 的全部内容, 来源链接: utcz.com/qa/426945.html

回到顶部