最近我问过关于从另一个类中获取类的唯一实例的问题。
( How to get specific instance of class from another class in Java? )
所以,我正在试着让它工作:
我的Application
public class Application
{
// I will always have only one instance of Application
private static Application _application;
// Every instance of Application (one in my case) should have its own View
private View view;
// Constructor for new instance of Application
private Application()
{
view = new View();
}
// Getter for my unique instance of Application
public static Application getSharedApplication()
{
if (_application == null)
_application = new Application();
return _application;
}
// Main class
public static void main(String[] args)
{
// So I'm accessing my instance of Application
Application application1 = getSharedApplication();
// Here is object reference
System.out.println(application1);
// And now I'm accessing the same instance of Application through instance of View
Application application2 = application1.view.getApplication();
// Here is object reference
System.out.println(application2);
}
}我的View
public class View
{
// I'm accessing my instance of Application again
public static Application application = Application.getSharedApplication();
// This method should return my unique instance of Application
public Application getApplication()
{
return application;
}
}问题是main方法返回不同的对象引用。
Application@1430b5c
Application@c2a132我的代码出了什么问题?
发布于 2012-08-17 02:05:09
下面是发生的情况:
视图程序首先调用Application application1 = getSharedApplication();
Application.
getSharedApplication(); (请注意,在这个阶段,_application仍然为空)。这将创建一个new Application() too您现在有2个应用程序实例。
请注意,如果将View v = new View();添加为main的第一行,则只有一个应用程序实例(从View的静态变量加载一次)。当你努力思考的时候,这是有意义的,但不是很直观……
发布于 2012-08-17 02:03:16
这类问题的一般答案是:使用调试器!例如,您可以在Application的构造函数中设置断点,运行程序,并在构造函数第二次执行时检查堆栈。
如果你这样做,你会注意到类似这样的东西:
Application.<init>() line: 21
Application.getSharedApplication() line: 31
View.<clinit>() line: 59
Application.<init>() line: 23
Application.getSharedApplication() line: 31 也就是说,视图希望在完全构造共享应用程序之前(以及在后者存储在静态字段中之前)获取共享应用程序。
发布于 2012-08-17 02:31:52
如果您更改视图的初始化,如下所示
public static Application getSharedApplication() {
if(_application == null)
{
_application = new Application();
view = new View();
}您会发现只创建了一个实例。原因是您在应用程序完全初始化之前创建了View实例。因为静态变量是在第一次请求类时加载的,所以这种行为就会发生。
无论如何,我学到了永远不要这样做:)谢谢:)
https://stackoverflow.com/questions/11992796
复制相似问题