java 编程技巧
1. 参数可空:
@注解表示修改的字段可为空值。看它的定义,可以修饰在方法,参数和字段(类似c#中的?)上。
@Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Nonnull(when = When.MAYBE) @TypeQualifierNickname public @interface Nullable { }
对应的还有@NotNull注释,表示不能为空
2.可变长参数
如:print(String... args ){} , 调用时可以是print("1"),pring("1","2"),print("1","2","3")
类似C#中的params.
3. 取出对象list中的一列值:
如List<String> roleNames = roles.stream().map(Role::getRoleName).collect(Collectors.toList());
4. list集合初始化:
如:List<String> alpha = Arrays.asList(
"a"
,
"b"
,
"c"
,
"d"
);
5. 使用lombok的val做本地变量的类型推导
如:val example = new ArrayList<String>();
在lombok2.0中将使用var, 与c#的var类似。
6.使用lombok的builder做对象初始化。
@Builder(toBuilder = true) @Getter public class UserInfo { private String name; private String email; private Money price; }
UserInfo userInfo = UserInfo.builder() .name("zzl") .email("bgood@sina.com") .build();
关于Lombok的使用技巧还有很多,如自动添加getter,setter. constructor, tostring方法,日志记录,builder等,
具体请参考:https://projectlombok.org/features/all
7.把字符串常量放在前面
通过把字符串常量放在比较函数equals()比较项的左侧来防止偶然的 NullPointerException 从来都不是一个坏主意,就像这样:
8. 检查null和长度
不管什么时候你有一个集合、数组或者其他的,确保它存在并且不为空。
9. return 一个空的集合,而不是 null
10. 小心使用 String
因为字符串相加或者拼接的方式都会在对象池中查找字符串是否存在,如果不存在则创建,这样在拼接的过程中会产生大量中间过程的字符串,占用内存资源。StringBuilder效率优于StringBuffer,但是StringBuffer线程安全。
另外,在实例化一个字符串对象,构造函数应该避免发生直接实例化,例如:
11.单引号和双引号之间的区别
尝试运行上面的程序。这个程序演示了一个死锁。这种死锁的产生是因为两个线程都在等待其他线程所抓取的资源。他们都不在任何一个版本。从代码,似乎还“HaHa”是回来了,但它实际上返回ha169。原因是,如果使用双引号,字符串对待,但在单引号的情况下,字符自动转换为int型,进行计算。
12. 尽量避免随意使用静态变量
要知道,当某个对象被定义为static变量所引用,那么GC通常是不会回收这个对象所占有的内存,如:
此时静态变量b的生命周期与A类同步,如果A类不会卸载,那么b对象会常驻内存,直到程序终止
13.尽量避免在循环中的创建对象
尽量避免在经常调用的方法,循环中new对象,由于系统不仅要花费时间来创建对象,而且还要花时间对这些对象进行垃圾回收和处理,在我们可以控制的范围内,最大限度的重用对象,最好能用基本的数据类型或数组来替代对象。
14. for-each循环优先于传统的for循环
for-each和for循环的做法都比while循环更好。但是由于for循环中需要创建一个临时变量,所以出错的可能性会稍大,宗旨是越简单越好,出错的可能性也低。