2013-03-14 45 views
0

问题是我有2个班。第一个类有一个创建第二个类的对象的方法。有没有可能得到该对象没有返回语句?并且还没有使其成为一个字段如何获得在void方法内实例化的对象?

实施例:

//第一类

public class First { 

    public First() { 
    } 

    public void aMethod(Object o) { 
     Second s = new Second(o); 
    } 
} 

//第二类

public class Second { 

    public Second() { 
    } 
} 

该方法是通过一个按钮的点击调用。

编辑: 很抱歉的混乱。但我不想更改代码的原因是因为我正在进行JUnit测试。

这两个类实际上是jFrames,我想测试的按钮。 在第一个类中,通过按钮调用该方法。在该方法中,它创建第二个Jframe。在这个Jframe中,我也想测试一个按钮,这就是为什么我需要实例化的jFrame对象。 在aMethod()我也传递了一些参数,第二个JFrame需要。所以我不能单独测试它。

+2

可以'amethod方法()'有参数(S)? – Kent 2013-03-14 15:11:21

+0

您提出的问题并没有什么意义 - 如果您想在“First”之外使用它,您为什么不想返回's'?请你可以编辑你的问题来解释**你想达到什么**,而不是**你认为你应该达到什么样的**? – 2013-03-14 15:11:56

+0

可能是这可以帮助: - http://stackoverflow.com/questions/2408626/returning-a-void-object – 2013-03-14 15:13:05

回答

1

这一切都取决于你的第一个对象是如何线程安全的/必须。

您可以设置一个实例变量,然后露出一个getter,但也许你正在尝试一些其他方面的限制内工作,因为这似乎是一个很奇怪的替代刚刚返回值。

public class First { 
    private Second s; 
    public First() { 
    } 

    public void aMethod() { 
     s = new Second(); 
    } 

    public Second getSecond(){ 
     return s; 
    } 
} 

编辑:另一个答案,因为我以某种方式错过了无场约束。

你可以使用可观察的图案,让你的听众第一客户端对象寄存器,然后你可以做;

Second s = new Second(); 
setChanged(); 
notifyObservers(s); 

http://docs.oracle.com/javase/6/docs/api/java/util/Observable.html

同样,这似乎有点小题大做,也许你可以给更多的背景下,以你不能编辑方法签名或使用领域的原因。

+4

'“...也没有使它成为一个领域”' – Dukeling 2013-03-14 15:16:07

+0

哦,是的,不知道我是如何错过了Dukeling。 – James 2013-03-14 16:02:41

0

您也可以为您传递到方法调用parmeter内返回。 类似:

public void aMethod(Result result) { 
      s = new Second(); 
      result.val = s; 
     } 

,其中结果可能是具有类型二的成员的类。 或者一个泛型类:

Result<Second> 

,但我不知道怎么会比简单的回报更好。

1

有两种可能性我能想到的:

1)aMethod()例如List list (or other types has Second Field),那么你可以list.add(new Second())主叫方可以从列表中得到它(最后一个元素)

2)另一种添加参数(如果你有),有一个静态字段private static Second second,你必须写setter/getter,还要关心线程安全问题......然后你可以在aMethod()Foo.setSecond(new Second());真的不好在实践中。

最后,我会问,你真的需要这样做吗?

0

最常见的是在使用所谓的工厂模式

public class First { 

public First() { 
} 

public Second aMethod(Object o) { 
    return new Second(o); 
} 

}