我今天注意到某个功能在我的API中根本不起作用,而且它实际上是对我在我的应用程序上使用API所取得的进展做出了贡献。绝对没有错误产生,应用程序不会停止,挂起甚至断断续续。就好像我打电话给return
并继续进行处理一样。
简而言之 类:
public abstract class Foo {
private static Foo singleton;
public Foo() {
singleton = this;
}
public static Foo getSingleton() {
return singleton;
}
public abstract int bar();
}
其中我有另一个继承此类的类:
public class Bar extends Foo {
public Bar(...) {
super...
}
@Override
public int bar() {
return 5;
}
}
现在,班级" Bar"并不是和" Foo"在同一个项目中。作为" Foo" class是作为依赖项添加的API(.jar)的一部分;但是在.jar中我有一些代码需要引用覆盖类设置的值而不是bar()
我目前使我女朋友感到不满的代码如下:
int foo = Foo.getSingleton().bar(); // This should return the value of 5 set earlier
哪个没有设置foo的值,实际上如果我在它之后添加System.out.println
,它甚至不会打印到控制台。它实际上只是感觉像return
&#39>
答案 0 :(得分:2)
此构造函数
private static Foo singleton;
public Foo() {
singleton = this;
}
如果您创建static
子类型的新实例,则只会调用初始化singleton
Foo
字段的。 Bar
。
您尚未显示涉及Bar
的新实例创建表达式,因此我假设没有一个。
就这样
int foo = Foo.getSingleton().bar(); // This should return the value of 5 set earlier
在尝试调用NullPointerException
返回的bar()
上的null
时,只能以getSingleton()
终止。
如果你没有看到NPE,那么你必须抓住它并忽略它。
答案 1 :(得分:0)
您的单身人士未正确实施。 Foo.getSingleton()
将在此时返回singleton
,null
。静态变量仅在构造函数中初始化,在您的示例中从不调用。您必须在静态上下文中初始化singleton
,例如在getSingleton()
方法中使用空检查:
public static Foo getSingleton() {
if(singleton == null) {
singleton = new Foo();
}
return singleton;
}
修改强>
正如MihaiC在评论中正确指出的那样,这是行不通的,因为Foo
是抽象的。我确实错过了那个小细节。考虑到这一点,除非你试图用Bar
实例以某种方式初始化它,否则拥有一个抽象类的单例是没有意义的。这个设计对我来说仍然很奇怪。对于一般概念,现在仍然留下我的答案。