最近在学MVP的模式+Retrofit+RxJava+Dagger2,遇到一些问题自己记录下来,在这里使用的单列模式是@Singleton,加注释的方法,网上百度没有,只是讲解了单列模式,然后自己顺便也去了解了一下。
单列模式
单例的实现有两个主流方式,分别是懒汉模式和饿汉模式,他们在实例化的时机和效率方面各有不同
1.懒汉模式
懒汉模式在外部对象每次获取实例时都要先判断该实例是否被初始化,这点相比饿汉模式来说就会损失一些效率,但是会节省一些空间,因为什么时候用到该实例才会去初始化.
/*
*单例模式
*/
public class Singleton {
private static Singleton instance;
private Singleton() {} //一定要有私有构造,要不谈何单例
public static Singleton getInstance(){
if (null == instance){
instance = new Singleton();
}
return instance;
}
}
但是在线程方面会有些问题
2.恶汉模式
饿汉模式是在系统运行起来,在装在类的时候就进行初始化的操作,外部对象使用的时候不需要做任何判断可以直接使用,从效率上来说是优于懒汉模式的.但是对比懒汉模式的延迟加载技术,不管系统用不用该实例,内存都会在最开始的时候创建出来.跟懒汉的时间换空间正好相反,饿汉是空间换时间.
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}//一定要有私有构造,要不谈何单例
public static Singleton getInstance(){
return instance;
}
}
而现在用的是dagger2,用注释的方法来实现的
目标类
public class A{
@Inject
public A() {
}
public String getName(){
return "AAAAAA";
}
}
module类
@Module
public class TestModule {
//单例获取
@Singleton
@Provides
A providesA(){
return new A();
}
}
component类
@Singleton
@Component(modules = TestModule.class)
public interface AComponent {
void inject(NewActivity act);
}
activity
public class NewActivity extends AppCompatActivity {
@Inject
A a1;
@Inject
A a2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new);
//实例化component对象
AComponent component = DaggerAComponent.builder().aModule(new AModule()).build();
//注入
component.inject(this);
//single单例只适用于一个component,也就是说下一个activity中又是不同的对象了
Log.e("---------",a1.toString()+" "+a2.toString());
}
}