0

我正在研究在两个类之间传递数据。在 ClassOne 中,我基于来自 GUI 的用户输入构建了一个 HashSet,然后我想通过引用将其传递给 ClassTwo。

问题是我的方法在运行时变量为空,但在构造函数中却没有。下面是我正在做的简化版本。

一级

public class ClassOne
{
    HashSet<String> extensions;

    // run this when the button is clicked
    class startListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            // run the method to populate the hashset
            parseExt();
            // create a new class passing HashSet
            classTwo = new classTwo(extensions);
        }
    }

    // populates HashSet
    public void parseExt()
    {
        extensions = new HashSet<String>();

        extensions.add("foo");
        extensions.add("bar");
        extensions.add("bat");
    }
}

二级

public class ClassTwo implements Runnable
{
    HashSet<String> extensions;

    public ChgOwner(HashSet<String> extensions)
    {
        this.extensions = extensions;
        // prints [foo, bar, bat]
        System.out.println(this.extensions);
    }

    public void run()
    {
        // prints []
        System.out.println(this.extensions);
    }

关于我做错了什么的想法?

=======

编辑:为了尝试澄清,变量扩展是通过 ClassTwo 的构造函数从 ClassOne 传递到 ClassTwo 的。在构造函数中,我将值分配给 ClassTwo 中的属性,也称为extensions。在 ClassTwo 的构造函数中,我可以打印结果为“[foo, bar, bat]”的扩展值。但是在 ClassTwo 中打印 run() 方法中的值时,HashSet 为空并输出“[]”。

我的问题是为什么 ClassTwo 的“扩展”属性在方法中是空的,而在构造函数中却不是?

4

2 回答 2

2

我希望在您将哈希集传递给 classtwo 之后,classone 会再次对其进行修改(可能会调用clear())。

于 2013-08-03T13:43:21.167 回答
1

你说:

编辑:为了尝试澄清,变量扩展是通过 ClassTwo 的构造函数从 ClassOne 传递到 ClassTwo 的。在构造函数中,我将值分配给 ClassTwo 中的属性,也称为扩展。在 ClassTwo 的构造函数中,我可以打印结果为“[foo, bar, bat]”的扩展值。但是在 ClassTwo 中打印 run() 方法中的值时,HashSet 为空并输出“[]”。

我的问题是为什么 ClassTwo 的“扩展”属性在方法中是空的,而在构造函数中却不是?

对此的答案很可能已经由jtahlborn发布并删除了一个答案。

由于您确定 Class2 实例是使用填充了相关数据的 HashSet 创建的,后来看到数据已经消失,这只能意味着正如 jtahlborn 所建议的那样,您正在从 HashSet 中删除数据创建 Class2 实例后。

要理解的关键概念是,当您将 HashSet 参数传递给 Class2 构造函数时,您传递的是对驻留在 Class1 中的原始 HashSet的引用。对原始对象所做的任何更改都将在对该对象的所有引用中看到。如果您不希望这种情况发生,那么您需要传入 HashSet 的副本

尝试做:

classTwo = new classTwo(new HashSet<String>(extensions));

由于字符串是不可变的,因此无需进行比这更深的复制。如果您的 HashSet 包含可变对象,则情况并非如此。

于 2013-08-03T18:32:57.067 回答