经常需要定义一些工具类或常量类,类中仅包含静态方法和静态变量,是不希望该类被实例化的,那么可以考虑私有化其构造方法,避免反射调用,在私有化的构造方法中抛出异常。
这种类的存在并没有任何问题,但却因为使用者很多时候也会使用到如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自动回收的性能高。
原文:https://www.cnblogs.com/kunkka-0717/p/14426502.html