通过私有构造器增强不可实例化的类的安全
经常需要定义一些工具类或常量类, 类中仅包含静态方法和静态变量, 是不希望该类被实例化的, 那么可以考虑私有化其构造方法, 避免反射调用, 在私有化的构造方法中抛出异常.
这种类的存在并没有任何问题, 但却因为使用者很多时候也会使用到如 new XXX().test() 的方式使用某个功能, 所以在使用工具类时, 常常会因为混淆将不需要实例化的工具类实例化之后再进行使用.
当然如果你的项目中使用了 lombok, 你也可以这么写, 虽然并不推荐:
- @NoArgsConstructor(access = AccessLevel.PRIVATE)
- public class Demo {
- ...
- }
缺点: 子类也会无法实例化
优先考虑使用依赖注入来引用资源
更加的灵活, 解耦代码, 当你传入的实现类是什么, 就会使用什么.
spring 的一个重要功能就是依赖注入.
要注意的是, 我们通常代码中定义的类都会包含在 spring 的扫描目录下, 如果不在此列的类, 最好在 BeanConfig 文件中生成一个, 提供给其他类注入, 而非在某些类中去 new
. 前提这个类可以作为一个单例类.
避免创建不必要的对象
这一点通常可以和依赖注入一起使用, 可以实现共享一些对象实例 (不具有状态的)
重点注意 3,4,5 即可
1. 无意义的创建新对象
String s = new String("hello world");
2. 未使用现成的对象
- // 注意即可 也很少有人这样写
- String s = "xxx";
- Boolean flag = new Boolean(s);
3. 隐蔽的对象创建
- public static boolean matches(String s) {
- return s.matches("^ 规则 $");
- }
- public static boolean matches(String regex, CharSequence input) {
- // 会 new 出一个 Pattern
- Pattern p = Pattern.compile(regex);
- Matcher m = p.matcher(input);
- return m.matches();
- }
- // 优化成
- private static final Pattern PATTERN = Pattern.compile("^ 规则 $");
- public static boolean matches(String s) {
- return PATTERN.matcher(s).matches();
- }
4. 自动拆装箱
- // 要优先使用基本类型而不是装箱基本类型, 要当心无意识的自动装箱.
- public static long sum() {
- Long sum = 0L;
- for(long i = 0; i < Integer.MAX_VALUE; i++){
- sum += i;
- }
- return sum;
- }
5. 对象池
如果是像数据库链接池这种创建实例有高昂代价的, 一般不需要维护自己的对象池. 有 2 个缺点
1. 会弄脏代码
2. 会增加内存占用, 降低性能, 当然性能这里是相对而言, 可能没有 jvm 自动回收的性能高.
来源: http://www.bubuko.com/infodetail-3728832.html