都说咧,Spring Boot就是为简化Spring开发而生,Boot么,快速启动,哪里不够快,就干倒它!这不是口号,Spring Boot就是这么干哩。
那现在仔细瞅瞅,我们的项目还有什么重复代码?毫无技术含量,都是简单的逻辑重复。看看我们的数据对象DO
/** * 博客类 */ public class BlogDo { /** * 序号 */ private Long id; /** * 标题 */ private String title; /** * 内容 */ private String content; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
有没有发现get/set方法,完全是固定模式的,只要属性名确定了,方法怎么写也就确定了。
而且我们平时写的时候,一般也不用自己手写,直接利用开发工具生成就行。既然是模板代码,何必浪费手工生成的时间。
使用Lombok,即可帮我们自动生成get/set模板代码,而且它还能做到更多!
首先下载lombok jar包,点此打开下载页
点击图中jar下载即可
下载之后双击打开,点击Specify Location
然后选择eclipse安装目录下的eclipse.exe,然后点击Install即可。
注意安装完了需要重启下eclipse。
安装完了还需要引入Lombok,哈哈,针对开发工具安装一次就够了,然后每个项目需要单独引入lombok依赖,如下所示,注意无须指定版本,因为SpringBoot2.2.5已经有默认关联的lombok版本了,当然你手工指定也OK。
<!-- 添加lombok相关功能 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency>
看注释,get/set/toString/equals/hashCode这些常用的都给我们生成了,简直太方便了!
/** * 博客类 */ @Data // 通过@Data注解为该类启用Lombok功能 public class BlogDo { /** * 序号 */ private Long id; /** * 标题 */ private String title; /** * 内容 */ private String content; /** * 测试入口 */ public static void main(String[] args) { BlogDo blog = new BlogDo(); // 自动生成了set方法 blog.setId(1L); blog.setTitle("测试博客"); blog.setContent("测试内容"); // 自动生成了get方法 System.out.println(blog.getId()); System.out.println(blog.getTitle()); System.out.println(blog.getContent()); // 自动生成了toString(),打印所有属性 System.out.println(blog); // 自动生成了equals方法 BlogDo otherBlog = new BlogDo(); otherBlog.setId(1L); otherBlog.setTitle("测试博客"); otherBlog.setContent("测试内容"); System.out.println(blog.equals(otherBlog));// 输出true,生成的equals判断所有属性相同 // 自动生成hashCode方法 System.out.println(blog.hashCode());// 输出577081312 System.out.println(otherBlog.hashCode());// 输出577081312 // 测试往set中添加数据 Set<BlogDo> set = new HashSet<BlogDo>(); System.out.println(set.add(blog));// 输出true System.out.println(set.add(otherBlog));// 输出false } }
在继承时,Lombok自动生成的toString、equals、hashCode方法默认会忽略父类的不同,其实这一点挺坑的,看例子。
/* * 父类-动物 */ @Data public class Animal { private String type; }
/** * 子类-人类,人类也是哺乳动物的一种 */ @Data public class Human extends Animal{ private String name; /** * 测试 */ public static void main(String[] args) { Human h1=new Human(); h1.setType("猿人"); h1.setName("老陈"); Human h2=new Human(); h2.setType("新人类"); h2.setName("老陈"); System.out.println(h1.toString());//输出:Human(name=老陈),可见直接忽略了父类 System.out.println(h1.equals(h2));//输出:true,判断相等也不看父类,其实这个不符合我们正常思维的 System.out.println(h1.hashCode()==h2.hashCode());//输出true,也不看父类情况 } }
其实默认应该是将父类的参数纳入计算,这样才符合我们正常思维,默认思维。
但是也能解决,添加以下两个注解,就能将父类内容纳入计算了
@ToString(callSuper = true)//让父类参与到计算 @EqualsAndHashCode(callSuper = true)//让父类参与到计算
我们纳入注解以后看下情况:
/** * 子类-人类,人类也是哺乳动物的一种 */ @Data @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) public class Human extends Animal{ private String name; /** * 测试 */ public static void main(String[] args) { Human h1=new Human(); h1.setType("猿人"); h1.setName("老陈"); Human h2=new Human(); h2.setType("新人类"); h2.setName("老陈"); System.out.println(h1.toString());//输出:Human(super=Animal(type=猿人), name=老陈) System.out.println(h1.equals(h2));//输出:false,父类参与判断了 System.out.println(h1.hashCode()==h2.hashCode());//输出false,父类参数参与计算了 } }
Lombok还是要用的,需要稍微注意一下使用中的问题就行。
另外equals和hashCode默认会让所有的属性参与计算,实际我们在写项目中,可能只用一个id计算。那就需要重写equals和hashCode方法。
一些童鞋不喜欢写hashCode,这是不对的哦,因为hashCode不光有助于快速查找,还影响相等的判断,所以不写hashCode可能直接导致判断失败!
一些散列集合如HashMap/HashSet,会先看hashCode是否相等,hashCode不等则直接认定不相等了,根本不会给equals机会。
所以记住:凡是重写equals,必须要重写hashCode!
最后今天是周日,祝大家周日哈皮!