抽象int()导致我的应用程序中出现不可见的停顿

时间:2014-12-16 15:25:59

标签: java

我今天注意到某个功能在我的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>

2 个答案:

答案 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()将在此时返回singletonnull。静态变量仅在构造函数中初始化,在您的示例中从不调用。您必须在静态上下文中初始化singleton,例如在getSingleton()方法中使用空检查:

public static Foo getSingleton() {
    if(singleton == null) {
        singleton = new Foo();
    }
    return singleton;
}

修改

正如MihaiC在评论中正确指出的那样,这是行不通的,因为Foo是抽象的。我确实错过了那个小细节。考虑到这一点,除非你试图用Bar实例以某种方式初始化它,否则拥有一个抽象类的单例是没有意义的。这个设计对我来说仍然很奇怪。对于一般概念,现在仍然留下我的答案。