2010-05-09 57 views
0

比方说,我有一些对象:动态确定对象的变量名称?

ArrayList<SomeObject> list = new ArrayList<SomeObject>(); 
SomeObject A = new SomeObject(); 
SomeObject B = new SomeObject(); 
SomeObject C = new SomeObject(); 
SomeObject D = new SomeObject(); 

这些构造函数自动将每个对象添加到ArrayList这样我就可以在它们之间迭代,但仍保持用于直接访问的变量名:

public SomeObject(){ 
    // init stuff here 
    list.add(this); 
} 

但随后,假设我想输出一些调试信息,并遍历列表并打印出每个对象的名称?我怎样才能做到这一点?实质上,当“SomeObject A = new SomeObject();”被执行,我想使用反射(如果可能的话)来确定这个变量的名字是“A”(一个字符串),并在构造函数执行时将其存储在对象中,或者在引用此对象时通过反射动态确定它名为“A”的变量。那有意义吗?我怎样才能做到这一点?

谢谢!

+0

对象在Java中没有名称。 – fredoverflow 2010-05-09 16:12:32

回答

3

编译器不会保留您在代码中定义的变量名称,所以在运行时这是不可能的。

+1

+1 A,B,C和D是对一个对象的引用,可能有多个对象的引用,这些对象不跟踪谁引用它们。所以比尔是对的,你需要跟踪你的程序。您可以在列表中的项目和单个参考之间始终执行==。 – 2010-05-09 15:11:17

3

我不明白你为什么坚持使用List,因为看起来你要找的是Map。地图中的条目是指定的对象,例如它有一个用于在地图中查找条目的键。

Map<String,SomeObject> map = new HashMap<String,SomeObject>(); 
map.put("A",new SomeObject()); 
map.put("B",new SomeObject()); 

如果你的对象有名字或需要知道它们的名字,那么该对象应该有一个名称作为属性。使用变量名称或映射键进行对象识别并不好。

Map<String,SomeObject> map = new HashMap<String,SomeObject>(); 
map.put("A",new SomeObject("A")); 
map.put("B",new SomeObject("B")); 

然而,这是重复的,您可能需要重构的是融入了更多表现力的设计通过引入新的类:

SomeObjects objects = new SomeObjects(); 
SomeObject objectA = objects.create("A"); 
SomeObject objectB = objects.create("B"); 
// The container can manage references if you like to 
SomeObject objectA = objects.get("A"); 

SomeObjects可以使用地图内部管理的对象:

class SomeObjects { 
    Map<String,SomeObject> objects = ...; 
    public SomeObject create(String name) { 
    SomeObject newObject = new SomeObject(name); 
    objects.put(name,newObject); 
    return newObject; 
    } 
    public SomeObject get(String name) { 
    return objects.get(name); 
    } 
} 

要迭代对象名称或遍历对象,容器可以简单地为映射的键或映射的值提供迭代器:

public class SomeObjects { 
Map<String,SomeObject> objects = ...; 
public Iterator<SomeObject> objects() { 
    return objects.values().iterator(); 
} 
public Iterator<String> names() { 
    return objects.keySet().iterator(); 
} 
} 

要使用这些迭代器,你可以这样做:

public void test() { 
SomeObjects objects = ...; 

for(SomeObject obj : objects.objects()) { 
    // Do something with the object 
} 

for(String objName : objects.names()) { 
    // Do something with the object name 
} 

} 

如果直接使用地图,你可以使用地图的Entry类,它是一个键值对:

public void test() { 
Map<String,SomeObject> objects = new HashMap<String,SomeObject>(); 
objects.put("A",new SomeObject()); 

for(Entry entry : objects.entrySet()) { 
    System.out.printlnt("Processing object with name: " + entry.getKey()); 
    SomeObject obj = entry.getValue(); 
    doSomethingWith(obj); 
} 
} 
0

您可以在SomeObject中创建一个名为Name的String字段并将名称存储在那里。

OR

虽然我恨这个答案很多:

假设你正在创建相同的对象每一次,你可以创建,检查引用的方法,像这样:

public void referenceChecker(SomeObject thing){ 
    if(A == thing) System.out.println("A"); 
    else if(B == thing) System.out.println("B"); 
    //etc etc 
} 

它不漂亮,它很烦人,但它的工作原理