effective解读-第五条 使用依赖注入引入资源
-
当一个类依赖于其他资源的时候,使用依赖注入的方式,资源由客户端指定。,而不使用单例或者静态工厂的方式(因为它两会限制引入资源的灵活性)。
-
依赖注入的资源具有不可变性,所以多个客户端可以共享依赖对象
-
依赖注入的方式适合于构造器、静态工厂、构建器。例如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(); } }
作者:刘志红
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!