有没有一种方法可以让我在构造函数中找到对象的名称?

Is there a method for me to find the name of an object within a constructor?

我有一个相当简单的 Java 相关问题。我需要以某种方式在构造函数中获取新对象名称以将其添加到数组中。如果可能的话,我将如何实现这一目标?

为了帮助可视化,这是我需要发生的事情。

TestExample example = new examplemain();
TestExample.element exelement = example.new element();

至此,随着新按钮对象的创建,我有了一个构造函数。 examplemain class 有一个称为更新的函数。我需要通过每个对象更新到 运行,以更新与 exelement 关联的绘图元素。最明显的方法是将它添加到数组中,然后在调用 example.update() 时,只需 运行 一个数组即可更新所有内容。像这样的东西会达到我正在寻找的效果,但仅限于执行元素,这是不好的。

element() {
TestExample.array[0]="exelement"
}

我找到了 this.toString()、getName() 或 getClass() 之类的东西,但我找不到任何有意义的方法来将它应用到我需要的方法中。重申一下,我需要能够做类似 TestExample.array[0].status=1.

的事情

提前致谢!

很遗憾,这绝对不可能。甚至反射也找不到仍在初始化过程中的字段名称。

例如,您必须将名称传递给构造函数。

理解您的意思有点困难,因为您的示例显然不符合您的意思。 (例如 TestExample.array[0] = "exelement" 只是保存一个字符串,您不能将其解析为变量。)

事实上,我很确定这些变量也是转移注意力1。你真正需要的是这样的:

// Simplistic incorrect version ...
public class Element {
    private static List<Element> allElements = new ArrayList<>();

    public Element() {
        ...
        allElements.add(this);
    }

    public void update() { ... } 

    public static void updateAll() {
        for (Element e: allElements) {
            e.update();
        }
    }
}

上面有几个问题。首先,使用 static 可能会导致内存泄漏,除非您有可靠的方法清除不再需要的任何元素,或者您使用引用类型以便 GC 可以断开链接。第二个问题是您的示例显然使用了 inner class.

所以使用内部 class,它可能看起来像这样:

public class Outer {
    private List<Element> allElements = new ArrayList<>();

    public class Element {
        
        public Element() {
            ...
            allElements.add(this);
        }

        public void update() { ... } 
    }

    public void updateAll() {
        for (Element e: allElements) {
            e.update();
        }
    }
}

现在...如果 Outer 实例变得无法访问,那么只能通过 allElements.

访问任何 Element 对象

1 - 但如果变量很关键,那么恐怕你就不走运了。 Java 不提供获取变量地址或使用反射查找局部变量的方法。这就是@Louis Wasserman 在 .

中所说的