欢迎来到刘志红的博客

别人说程序员是“搬砖”的码农,但我们知道自己是追求个性的艺术家。也许我们不会过多的在意自己的外表和穿着,但在不羁的外表下,骨子里追求着代码的美、系统的美、设计的美。
扩大
缩小

effective解读-第五条 使用依赖注入引入资源

  1. 当一个类依赖于其他资源的时候,使用依赖注入的方式,资源由客户端指定。,而不使用单例或者静态工厂的方式(因为它两会限制引入资源的灵活性)。

  2. 依赖注入的资源具有不可变性,所以多个客户端可以共享依赖对象

  3. 依赖注入的方式适合于构造器、静态工厂、构建器。例如Spring的依赖注入可以通过工厂方式的注入,构造注入等

interface Resource{
    void method();
}
class Resource1 implements Resource {
    public static final Resource resource = new Resource1();
    private Resource1(){
    }
    @Override
    public void method(){
        System.out.println("Resorce.method1");
    }
}
class Resource2 implements Resource{
    public static final Resource resource = new Resource2();
    private Resource2(){}
    @Override
    public void method(){
        System.out.println("Resorce.method2");
    }
}
​
/**
 * 只能使用Resource1
 */
 class StaticDemo {
    private static final Resource resource = Resource1.resource;
    private StaticDemo(){}
    public static void handle(){
        resource.method();
    }
}
​
/**
 * 只能使用Resource1
 */
class SingletonDemo {
    private static final Resource resource = Resource2.resource;
    public static SingletonDemo singletonDemo = new SingletonDemo();
    private SingletonDemo(){}
    public  void handle(){
        resource.method();
    }
}
//书中提到上面的单例、工厂中添加set方法,然后客户端动态的设置值。这样做显得笨拙、容易出错并且不支持并行工作。
/**
 * 使用set修改值得方式
 */
class SingletonSetDemo {
    private Resource resource;
    public void setResource(Resource resource) {
        this.resource = resource;
    }
    public static SingletonSetDemo singletonSetDemo = new SingletonSetDemo();
​
    private SingletonSetDemo() {
    }
    public void handle() {
        resource.method();
    }
}
public class Main{
    public static void main(String[] args) {
        SingletonSetDemo singletonSetDemo = SingletonSetDemo.singletonSetDemo;
        //报错,在没由set值得时候该方法无法使用,并行完成任务得时候会出错
        //注意该处只有一个资源,实际业务中可能多个资源都需要set
        singletonSetDemo.handle();
        singletonSetDemo.setResource(Resource2.resource);
        singletonSetDemo.handle();
    }
}
/**
 * 这里是构造注入的方式
 * 也可以使用依赖注入的框架例如Spring等
 */
class AutowireSingletonDemo{
    private  final Resource resource;
    public AutowireSingletonDemo(Resource resource) {
        this.resource = Objects.requireNonNull(resource);
    }
    public void handle(){
        resource.method();
    }
}
 

 

posted on 2021-03-26 14:38  MR_程序猿刘  阅读(85)  评论(0编辑  收藏  举报

导航