当前位置: 首页 > article >正文

Effective 建造者模式、私有化、依赖注入

Effective 2 遇到多个构造器参数时要考虑使用构建器(建造者模式)

Effective 3 用私有构造器或者枚举类型强化SingleTon属性

  1. 方法一

    public class Elvis {
        public static final Elvis INSTANCE = new Elvis();
        private Elvis() {}
    }
    

    私有构造器仅被调用一次,用来实例化公有的静态final域Elvis.INSTANCEl。由于缺少公有的或受保护的构造器,所以保证了Elvis的全局唯一性:一旦Elvis类被实例化,将会只存在一个Elvis实例。客户端的任何行为都不会影响这一点

    但是,反射可以改变借助 AccessibleObject.setAccessible方法通过反射机制调用私有构造器。如果需要抵御这种攻击,可以修改构造器,让他在要求创建第二个实例的时候抛除异常

  2. 方法二

    public class Elvis {
        private static final Elvis INSTANCE = new Elvis();
        private Elvis() {}
        public static Elvis getInstance() {return INSTANCE;}
    }
    
  3. 方法三

​ 声明一个包含单个元素的枚举类型

public enum Elvis {
    INSTANCE
}

无偿的提供了序列化机制,绝对防止多次实例化,即使是面对复杂的序列化或反射攻击时。

Effective 4 优先考虑依赖注入来引入资源

当创建一个新的实例时,就讲该资源传到构造器中。这就是依赖注入 的一种形式:词典 是拼写检查器的一个依赖,在创建拼写检查器时就将该词典注入其中

public class SpellChecker {
    private final Lexicon dictionary;

    public SpellChecker(Lexicon dictionary) {
        this.dictionary = dictionary;
    }
    
    // other method
}

虽然依赖注入极大提升了灵活性和可观测性,但他会导致大项目凌乱不堪,因为它通常包含上千个依赖。不过这种凌乱用一个依赖注入框架便可以终结,如Dagger、Guice或者Spring。请注意:设计成手动依赖注入的API,一般都使用于这些框架


http://www.kler.cn/news/17087.html

相关文章:

  • 五一欢乐赛!题解
  • 希尔排序(C++)
  • 安卓开发_广播机制_广播的最佳实践:实现强制下线功能
  • PyQt5桌面应用开发(5):对话框
  • Java 基础进阶篇(二)—— static 静态关键字与单例模式
  • kafka 学习,笔记
  • Spring Boot参考指南-Spring Boot安装(Maven安装、Gradle安装)
  • Docker compose 常用指令
  • c++ 11标准模板(STL) std::vector (二)
  • 天气预报查询 API 提供个性化的天气服务的设计思路
  • 贪心刷题~
  • AI 时代,提示词便是生产力
  • ChatGPT AI使用成本
  • 【每日随笔】操控人性 ③ ( 懂领导的心思 | 办事的套路 | 管理学与权谋 | 人事谱系 )
  • HDU5552 Bus Routes(分治NTT)
  • 每天一道算法练习题--Day16 第一章 --算法专题 --- ----------哈夫曼编码和游程编码
  • SpringCloud:ElasticSearch之数据同步
  • 【实例展示通俗易懂】SQL中的内外连接、左右连接
  • Vue3+Element Plus环境搭建和一键切换明暗主题的配置
  • 【Latex】有关于Latex tabularray的一些很不错的教程、模板
  • LeetCode周赛复盘(第343场周赛)
  • isNotBlank 和isNotEmpty的区别
  • 网络安全 等级保护 网络设备、安全设备知识点汇总
  • Nachos系统的上下文切换
  • Latex 定理和证明类环境(amsthm)和(ntheorm)的区别
  • 每日一题142——最少操作使数组递增
  • 【Linux超强学习路线图】赶紧收藏学习!
  • 数据库管理-第七十二期 复盘(20230505)
  • 【TCP为什么需要粘包和拆包】
  • LeetCode_双指针_中等_24.两两交换链表中的节点