我需要使用可以通过循环轻松获得的命名模式来创建大量对象。有什么办法可以像这样从变量中读取对象名称?
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书籍中阅读有关 Collections API 的章节。
我需要使用一种命名模式创建大量对象,这种命名模式可以通过循环轻松获得。有没有办法像这样从变量中读取对象名? 我不需要为对象分配变量名,只需要在分配时从对象中获取名称即可。
问题内容: 我想使用变量的值来访问对象。 假设我有一个名为myobject的对象。 我想用此名称填充变量,然后使用该变量访问对象。 例: 问题答案: 全球: 全球:v2 本地:v1 本地:v2
问题内容: 这就是我想要做的-这是伪代码,不起作用。有谁知道如何真正做到这一点: 问题答案: 如果您这样做是可行的: ..?
问题内容: 假设我在网站的各个页面上使用了三种单独的配色方案。每种颜色都有浅,中和深三种色调,并且配色方案由体内的类别定义。假定默认为“红色”配色方案。像这样: 颜色定义 : 基本默认样式示例 不同的配色方案样式示例 我想使用变量,这样我就不必为每种方案重新编写所有的颜色变化,这样我就可以编写如下内容: …但是我不太了解如何完成这项工作。帮帮我…? 问题答案: 在选择器和参数混合中使用插值和转义,
问题内容: 说我有Method1(void),Method2(void)… 有什么方法可以选择其中一个带有变量的方法吗? 问题答案: 使用反射:
如果它走路像鸭子,说话像鸭子,样子像鸭子,叫声也像鸭子,那它就是一只鸭子。 对于 Nutz Ioc 来说,它面对的配置文件就是层层嵌套的 "名值对集合",或者说是 Map 集合。 事实上,它是先把整个配置文件解析成 Map 再做判断的。 如果一个 Map 仅包括如下的键,则被认为是一个注入对象: type 对象类型 singleton 是否单例 scope 生命周期范围 events 监听事件 a