如何为改造2制作单身?

时间:2017-01-16 08:46:45

标签: android singleton gson retrofit

如果存在多次改装调用,我如何进行改造的单例,以便在类中不会重复代码,从而摆脱不必要的代码。

5 个答案:

答案 0 :(得分:5)

这是一个例子,但是!虽然这可能是闪亮的,易于使用,但单身人士是邪恶的。尽可能避免使用它们。另一种方法是使用依赖注入。

反正。

public class Api {
    private static Api instance = null;
    public static final String BASE_URL = "your_base_url";

    // Keep your services here, build them in buildRetrofit method later
    private UserService userService;

    public static Api getInstance() {
        if (instance == null) {
            instance = new Api();
        }

        return instance;
    }

    // Build retrofit once when creating a single instance
    private Api() {
        // Implement a method to build your retrofit
        buildRetrofit(BASE_URL);
    }

    private void buildRetrofit() {
        Retrofit retrofit = ...

        // Build your services once
        this.userService = retrofit.create(UserService.class);
        ...
    }

    public UserService getUserService() {
        return this.userService;
    }
    ...
}

现在你把所有东西放在一个地方。使用它。

UserService userService = Api.getInstance().getUserService();

答案 1 :(得分:1)

要实现单例类,最简单的方法是将类的构造函数设置为私有。

  1. 急切初始化:
  2. 在急切的初始化中,Singleton Class的实例是在类加载时创建的,这是创建单例类的最简单方法。

    public class SingletonClass {
    
    private static volatile SingletonClass sSoleInstance = new SingletonClass();
    
        //private constructor.
        private SingletonClass(){}
    
        public static SingletonClass getInstance() {
            return sSoleInstance;
        }
    }
    
    1. 延迟初始化:
    2. 此方法将检查是否已创建该类的任何实例?如果是,那么我们的方法(getInstance())将返回该旧实例,如果没有,则它在JVM中创建单例类的新实例并返回该实例。这种方法称为惰性初始化。

      public class SingletonClass {
      
          private static SingletonClass sSoleInstance;
      
          private SingletonClass(){}  //private constructor.
      
          public static SingletonClass getInstance(){
              if (sSoleInstance == null){ //if there is no instance available... create new one
                  sSoleInstance = new SingletonClass();
              }
      
              return sSoleInstance;
         }
      }
      

      还有更多的东西,比如 Java Reflection API,Thread Safe&序列化安全 Singleton。

      请查看此参考,以获取更多详细信息并深入了解单例对象创建。

      https://medium.com/@kevalpatel2106/digesting-singleton-design-pattern-in-java-5d434f4f322#.6gzisae2u

答案 2 :(得分:0)

subsets(2)

答案 3 :(得分:0)

public class Singleton  {

    private static Singleton INSTANCE = null;

    // other instance variables can be here

    private Singleton() {};

    public static Singleton getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new Singleton();
        }
        return(INSTANCE);
    }

    // other instance methods can follow 
}



import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitClient {

    private static Retrofit retrofit = null;

    public static Retrofit getClient(String baseUrl) {
        if (retrofit==null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(baseUrl)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}




@Module
public class NetworkModule {

    @Provides
    @Singleton
    public Gson gson() {
        GsonBuilder gsonBuilder = new GsonBuilder();
        return gsonBuilder.create();
    }

    @Provides
    @Singleton
    public HttpLoggingInterceptor loggingInterceptor() {
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(
                message -> Timber.i(message));
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        return interceptor;
    }

    @Provides
    @Singleton
    public Cache cache(File cacheFile) {
        return new Cache(cacheFile, 10 * 1000 * 1000); //10MB Cache
    }

    @Provides
    @Singleton
    public File cacheFile(@ApplicationContext Context context) {
        return new File(context.getCacheDir(), "okhttp_cache");
    }

    @Provides
    @Singleton
    public OkHttpClient okHttpClient(HttpLoggingInterceptor loggingInterceptor, Cache cache) {
        return new OkHttpClient.Builder()
                .addInterceptor(loggingInterceptor)
                .cache(cache)
                .build();
    }

    @Provides
    @Singleton
    public Retrofit retrofit(OkHttpClient okHttpClient, Gson gson) {
        return new Retrofit.Builder()
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(okHttpClient)
                .baseUrl("you/base/url")
                .build();
    }
}

答案 4 :(得分:0)

我在 kotlin 中尝试过:

/:url([a-z/]*[A-Z]+[a-z/]*)/

然后:

var service:ServicesInterface?= RetrofitClient.getRetrofitObject()?. create(ServicesInterface :: class.java)