最近在公司内总发现,大哥写的集合代码几乎不不为空。例如这样的!
public void completeTask(){
Categories categories = new Categories();
List<SubCategories> subCategories = categories.getSubCategories();
for (SubCategories subCategory : subCategories) {
subCategory.setId("1");
subCategory.setName("1");
}
System.out.println("subCategories = " + categories.getSubCategories().toString());
}
很多地方都这个,并没有把categories 的subCategories重新设置回去,因为刚刚进入公司,很多出的代码都这样写,经常让我摸不到头脑,我经常就想,如果我没有这样取出来值不是很容易为空值吗,
public class Categories {
List<String> categories;
List<SubCategories> subCategories;
public Categories() {
}
public Categories(List<String> categories, List<SubCategories> subCategories) {
this.categories = categories;
this.subCategories = subCategories;
}
public List<String> getCategories() {
if (categories == null){
categories = new ArrayList<>();
}
return categories;
}
public void setCategories(List<String> categories) {
this.categories = categories;
}
public List<SubCategories> getSubCategories() {
if (subCategories == null){
subCategories = new ArrayList<>();
}
return subCategories;
}
public void setSubCategories(List<SubCategories> subCategories) {
this.subCategories = subCategories;
}
}
后面我点进这个类发现破案了,以前经常使用lombok提供的注解,导致直接在取对象的元素出来的时候总是不注意(这个对象经常都是一种集合形式)为空,取出来后经常为空要重新写一个集合在set回去,而不是修改原来的数据。这个巧妙的判空就在于即使我们取到的值为空,保证返回值不为空,好处是确保getSubCategories方法始终返回一个非空的List对象,避免调用者因返回null而导致NullPointerException。逻辑简单清晰,易于理解和维护。通过检查并初始化subCategories,确保只有一个列表实例被所有调用共享,有助于节省资源。这样的写法确实很优雅。