如果在私有构造函数中初始化,则从静态方法访问时,保证私有静态字段为非null

时间:2016-04-05 12:53:58

标签: java static initialization

我有一个名为UrlController的类,方法如下:

public class UrlController {
    private static final String BASE_URL = "http://api.site.mil/";       

    private static Retrofit retrofit;

    private UrlController() {
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }

    public static Retrofit getRetrofit() {
        return retrofit;
    }
} 

我应该检查if(retrofit==null)方法中的getRetrofit()还是始终不为空?

3 个答案:

答案 0 :(得分:10)

没有任何内容可以构建UrlControllerUrlController除外,因为您的构造函数为private)因此retrofit保证为null。我想你想要一个 static初始值设定项。像,

static {
    retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
}

答案 1 :(得分:5)

由于方法getRetrofitstatic,因此即使尚未创建类的对象,也可以调用它。

因此,您必须检查它。

但即使您不检查,该方法也会返回null。因此,您必须在调用此方法的地方检查null。

答案 2 :(得分:2)

您是否尝试创建单身人士?

因为现在你有一个只能在类中调用的私有构造函数。因此,您的改装字段将始终为null。此外,你可能想要使用这样的东西:

assets/

通过它你可以简单地调用public final class UrlController { private static final String BASE_URL = "http://api.site.mil/"; private static volatile Retrofit instance; private UrlController() { instance = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } public static Retrofit getInstance() { if (instance == null) { synchronized (UrlController.class) { if (instance == null) { instance = new UrlController(); } } } return instance; } } ,你永远不会得到它。