我正在努力在两个类之间传递数据。在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");
}
}
ClassTwo
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中的属性,也称为扩展。在ClassTwo的构造函数中,我可以打印扩展的值,结果为“[foo,bar,bat]”。但是当在ClassTwo中的run()方法中打印值时,HashSet为空并输出“[]”。
我的问题是为什么ClassTwo的“extensions”属性在方法中是空的,而不是在构造函数中?
答案 0 :(得分:2)
我希望在你将hashset传递给classtwo后,classone会再次修改它(也许会调用clear()
)。
答案 1 :(得分:1)
你说:
编辑:为了尝试澄清,变量扩展正在从ClassOne传递到ClassTwo,通过ClassTwo的构造函数。在构造函数中,我将值分配给ClassTwo中的属性,也称为扩展。在ClassTwo的构造函数中,我可以打印扩展的值,结果为“[foo,bar,bat]”。但是当在ClassTwo中的run()方法中打印值时,HashSet为空并输出“[]”。
我的问题是为什么ClassTwo的“extensions”属性在方法中是空的,而不是在构造函数中?
jtahlborn已经发布并删除了答案。
既然您确定使用填充了相关数据的HashSet创建了Class2实例,并且稍后看到数据消失了,这只能意味着jtahlborn建议您删除数据从HashSet 之后创建Class2实例。
要理解的关键概念是,当您将HashSet参数传递给Class2构造函数时,您将引用传递给位于Class1中的原始HashSet。对原始对象所做的任何更改都将在对该对象的所有引用中看到。如果您不希望这种情况发生,那么您需要传入HashSet的副本。
尝试做:
classTwo = new classTwo(new HashSet<String>(extensions));
由于字符串是不可变的,因此不需要做比这更深的复制。如果您的HashSet包含可变对象,则情况并非如此。