【问题标题】:Java: Passed Variable Empty in Method But Not in ConstructorJava:在方法中传递了空变量,但在构造函数中没有
【发布时间】:2013-08-03 13:11:03
【问题描述】:

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

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

ClassOne

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);
    }

想到我做错了什么?

=======

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

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

【问题讨论】:

  • 也许是我,但我完全不明白你的问题,贴出的代码对我没有帮助。请为我们进一步澄清您的问题。考虑创建并发布sscce
  • @HovercraftFullOfEels 不只是你 m8
  • 将hashset传给classtwo后,classone是否再次修改(可能调用clear())?
  • @jtahlborn 删除的答案可能已经确定了您的问题。再次,请澄清。
  • @HovercraftFullOfEels 刚刚更新以尝试澄清。

标签: java constructor hashset


【解决方案1】:

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

【讨论】:

  • 这并不能真正回答问题。如果您有其他问题,可以点击 进行提问。您也可以add a bounty 引起更多关注。
  • @Rubens - 也许应该在评论之前阅读整个问题和 cmets。你可以认为我的问题是修辞性的。
  • @Sergio - 同上我对鲁本斯说的话
  • @jtahlborn 只要这是一个问题——不管是不是修辞——我觉得可以添加评论。但是,如果您认为您的修辞问题足以作为答案,而不是在 OP 的帖子中发表评论,我会取消我的评论。
  • @Rubens - 您是否阅读了整个问题、cmets 和其他答案?
【解决方案2】:

你说:

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

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

jtahlborn 发布和删除的答案很可能已经给出了答案。

由于您确定 Class2 实例是使用填充了相关数据的 HashSet 创建的,后来发现数据已消失,这只能意味着您正在删除数据从 HashSet 您创建 Class2 实例之后。

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

尝试做:

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

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

【讨论】:

  • @jtahlborn 谢谢!之后我打电话给 clear() 。我想我在想在 run() 方法中的操作完成之前不会调用它。哇!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 2021-05-15
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多