当前位置: 首页 > 科技观察

代码清洁的春天!Java效率利器Lombok

时间:2023-03-14 14:26:22 科技观察

还在写枯燥难维护的POJO吗?洁癖的春天在哪里?请看看龙目岛!在以往的Java项目中,不友好的代码太多了:POJOgetter/setter/toString;异常处理;I/O流关闭操作等。这些样板代码没有技术含量,影响代码。美丽,龙目岛应运而生。首先解释一下:任何技术的出现都是为了解决某一类问题。如果在此基础上构建,还不如回归Java本身。合理使用应该保持公平而不是滥用。Lombok的使用很简单,一起来看看吧:1)引入对应的maven包:org.projectlomboklombok1.16。18providedLombok的scope=provided,表示只在编译阶段生效,不需要包含在包中。正是如此,Lombok在编译时正确地将带有Lombok注解的Java文件编译成完整的Class文件。2)添加对Lombok的IDE工具支持:在IDEA中引入Lombok支持如下:点击File--Settings设置界面安装Lombok插件:点击File--Settings设置界面启用AnnocationProcessors:启用此项启用编译阶段的Lombok注解开始发挥作用。可以自己安装Eclipse的Lombok插件,比较简单。值得一提的是,Eclipse内置的编译器并不是Oraclejavac,而是eclipse自己实现的EclipseCompilerforJava(ECJ)。要使ECJ支持Lombok,需要在eclipse.ini配置文件中添加如下两项:-Xbootclasspath/a:[lombok.jar所在路径]-javaagent:[lombok.jar所在路径]3)Lombok实现原理:从Java6开始,javac支持“JSR269PluggableAnnotationProcessingAPI”规范,只要程序实现了该API,就可以在javac运行时调用。Lombok是一个实现“JSR269API”的程序。在使用javac的过程中,其功能的具体过程如下:javac分析源代码,生成抽象语法树(AST)。在javac编译过程中,调用了实现JSR269的Lombok程序。处理步骤中得到的AST,找到Lombok注解所在类对应的语法树(AST),然后修改语法树(AST),添加Lombok注解定义的对应树节点javac使用修改后的抽象语法树(AST)生成词段代码文件4)Lombok注解的使用:POJO类常用注解:@Getter/@Setter:在action类上,生成所有成员变量的getter/setter方法;作用于成员变量,生成成员变量的getter/setter方法。可以设置访问权限,是否延迟加载等。packagecom.trace;importlombok.AccessLevel;importlombok.Getter;importlombok.Setter;/***CreatedbyTraceon2018/5/19.
*DESC:测试类*/@SuppressWarnings("unused")publicclassTestClass{publicstaticvoidmain(String[]args){}@Getter(value=AccessLevel.PUBLIC)@Setter(value=AccessLevel.PUBLIC)publicstaticclassPerson{privateStringname;privateintage;privatebooleanfriendly;}publicstaticclassAnimal{privateStringname;privateintage;@Getter@Setterprivatebooleanfunny;}}在结构视图中,可以看到生成了getter/setter等方法:编译后的代码如下:【这也是传统Java编程需要写的样板代码】////Sourcecoderecreatedfroma.classfilebyIntelliJIDEA//(poweredbyFernflowerdecompiler)//packagecom.trace;publicclassTestClass{publicTestClass(){}publicstaticvoidmain(String[]args){}publicstaticclassAnimal{privateStringname;privateintage;privatebooleanfunny;publicAnimal(){}publicbooleanisFunny(){returnthis.funny;}publicvoidsetFunny(booleanfunny){this.funny=funny;}}Personpublic{privateStringname;privateintage;privatebooleanfriendly;publicPerson(){}publicStringgetName(){returnthis.name;}publicintgetAge(){returnthis.age;}publicbooleanisFriendly(){returnthis.friendly;}publicvoidsetName(Stringname){this.name=name;}publicvoidsetAge(intage){this.age=age;}publicvoidsetFriendly(booleanfriendly){this.friendly=friendly;}}}@ToString:作用于类,覆盖默认的toString()方法,可以通过of属性限制某些字段的显示,以及使用exclude属性排除某些字段@EqualsAndHashCode:作用于类,覆盖默认的equals和hashCode@NonNull:主要作用于成员变量和参数,标识符不能为空,否则会抛出空指针异常。@NoArgsConstructor、@RequiredArgsConstructor、@AllArgsConstructor:作用于类生成构造函数。有staticName和access等属性。一旦设置了staticName属性,就会以静态方法的形式生成实例,access属性可以限制访问权限。@NoArgsConstructor:生成无参构造函数;@RequiredArgsConstructor:生成包含final和@NonNull注解的成员变量的构造函数;@AllArgsConstructor:生成一个全参数构造函数。编译结果:publicstaticclassPerson{@NonNullprivateStringname;privateintage;privatebooleanfriendly;publicStringtoString(){return"TestClass.Person(name="+this.getName()+",age="+this.getAge()+")";}@NonNullpublicStringgetName(){returnthis.name;}publicintgetAge(){returnthis.age;}publicbooleanisFriendly(){returnthis.friendly;}publicvoidsetName(@NonNullStringname){if(name==null){thrownewNullPointerException("name");}else{this.name=name;}}publicvoidsetAge(intage){this.age=age;}publicvoidsetFriendly(booleanfriendly){this.friendly=friendly;}privatePerson(){}privatestaticTestClass.Personof(){returnnewTestClass.Person();}@ConstructorProperties({"name"})Person(@NonNullStringname){if(name==null){thrownewNullPointerException("name");}else{this.name=name;}}@ConstructorProperties({"name"“年龄”,“友好”})publicPerson(@NonNullStringname,intage,booleanfriendly){if(name==null){thrownewNullPointerException("name");}else{this.name=name;this.age=age;this.friendly=friendly;}}}@Data:作用于类,是以下注解的集合:@ToString@EqualsAndHashCode@Getter@Setter@RequiredArgsConstructor@Builder:作用于类,将类转化为builder模式@Log:作用于类,为不同的日志实现产品生成日志变量,有不同的注解:其他重要注解:@Cleanup:自动关闭资源,对实现java.io.Closeable接口的对象有效。比如一个典型的IO流对象的编译结果如下:是不是太简洁了?@SneakyThrows:可以捕获并抛出checked异常,上面的main方法可以重写如下:@Synchronized:作用在方法层面,可以代替synchronize关键字或者lock,用处不大。