用netbeans泄漏这个构造函数java

时间:2014-01-30 14:00:52

标签: java netbeans constructor initialization

我正在使用customButtons作为加载JButton的容器。我通过名称获取按钮(但是通过配置文件):

getComponent("btn1"); 

我已经这样做了,有一个漂亮的按钮列表,一个简单的函数概述,以及对正确的面板“jpt”的引用,以获得编译器给我的所有帮助。

按钮的顺序,数量和选择也需要由非程序员配置 - 我发现一个按钮变量名称列表才能正常工作。

问题是:Netbeans 7.4给我警告“在构造函数中泄漏这个”(第9行),这是真的,因为我这样做。有没有更正确的方法来实现相同的结果?

public class CustomButtons extends javax.swing.JPanel {

    CustomJPanel jpt;
    HashMap<String, Component> components;

    public CustomButtons (CustomJPanel jpt) {
    this.jpt = jpt;
    initComponents();
    components = getAllComponentsInContainer(this);
}

public Component getComponent(String name) {
    return components.get(name);
}

private HashMap<String, Component> getAllComponentsInContainer(Container root) {
    HashMap<String, Component> comps = new HashMap<>();
    for (Component c : root.getComponents()) {
        comps.put(c.getName(), c);
        if (c instanceof Container) {
            comps.putAll(getAllComponentsInContainer((Container) c));
        }
    }

    return comps;
}

2 个答案:

答案 0 :(得分:0)

如果getComponents()保证在您拨打getAllComponentsInContainer(this)时初始化,您可能不会过于担心警告 - 主要是警告您实例不可能尚未完全初始化。

如果您想避免出现警告,可以将getAllComponentsInContainer更改为仅接受getComponents()的结果:

components = getAllComponents(getComponents());
...
private HashMap<String, Component> getAllComponents(Component[] containerComponents) {
    HashMap<String, Component> comps = new HashMap<>();
    for (Component c : containerComponents) {
        comps.put(c.getName(), c);
        if (c instanceof Container) {
            comps.putAll(getAllComponents((Container) c).getComponents());
        }
    }

    return comps;
}

或者,您可以,例如,在构造函数完成后需要在您的类中添加initialise方法(但这意味着您可能会忘记在某处调用它):

public void initialise() {
    components = getAllComponents(getComponents());
}

答案 1 :(得分:0)

你可以只在构造函数中放置方法getAllComponentsInContainer的实现,并将所有实例变量设置为你是作者的同一个类,我不能编写精确的实现,因为不确定你在initComponents()方法中做了什么。