[Lombok] Lombok的使用和常用注解使用示例
为何要使用Lombok
我们在开发过程中,通常都会定义大量的JavaBean,然后通过IDE去生成其属性的构造器、getter、setter、equals、hashcode、toString方法,当要增加属性或者对某个属性进行改变时,比如命名、类型等,都需要重新去生成上面提到的这些方法。这样重复的劳动没有任何意义,Lombok里面的注解可以轻松解决这些问题。
Lombok简介
Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。
官方地址:https://projectlombok.org/
github地址:https://github.com/rzwitserloot/lombok
Lombok问题
无法支持多种参数构造器的重载
Lombok使用
1.添加maven依赖
1 2 3 4 5 | < dependency > < groupId >org.projectlombok</ groupId > < artifactId >lombok</ artifactId > < version >1.16.6</ version > </ dependency > |
2.idea中需要添加插件才能支持Lombok(IntelliJ Lombok plugin)
3.Lombok的使用
@NonNull
使用Lombok
1 2 3 4 5 6 7 8 9 10 | import lombok.NonNull; public class NonNullExample extends Something { private String name; public NonNullExample( @NonNull Person person) { super ( "Hello" ); this .name = person.getName(); } } |
不使用Lombok
1 2 3 4 5 6 7 8 9 10 11 12 13 | import lombok.NonNull; public class NonNullExample extends Something { private String name; public NonNullExample( @NonNull Person person) { super ( "Hello" ); if (person == null ) { throw new NullPointerException( "person is marked @NonNull but is null" ); } this .name = person.getName(); } } |
@Cleanup
使用Lombok
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import lombok.Cleanup; import java.io.*; public class CleanupExample { public static void main(String[] args) throws IOException { @Cleanup InputStream in = new FileInputStream(args[ 0 ]); @Cleanup OutputStream out = new FileOutputStream(args[ 1 ]); byte [] b = new byte [ 10000 ]; while ( true ) { int r = in.read(b); if (r == - 1 ) break ; out.write(b, 0 , r); } } } |
不使用Lombok
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | import java.io.*; public class CleanupExample { public static void main(String[] args) throws IOException { InputStream in = new FileInputStream(args[ 0 ]); try { OutputStream out = new FileOutputStream(args[ 1 ]); try { byte [] b = new byte [ 10000 ]; while ( true ) { int r = in.read(b); if (r == - 1 ) break ; out.write(b, 0 , r); } } finally { if (out != null ) { out.close(); } } } finally { if (in != null ) { in.close(); } } } } |
@Getter and @Setter
使用Lombok
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; public class GetterSetterExample { /** * Age of the person. Water is wet. * * @param age New value for this person's age. Sky is blue. * @return The current value of this person's age. Circles are round. */ @Getter @Setter private int age = 10 ; /** * Name of the person. * -- SETTER -- * Changes the name of this person. * * @param name The new value. */ @Setter (AccessLevel.PROTECTED) private String name; @Override public String toString() { return String.format( "%s (age: %d)" , name, age); } } |
不使用Lombok
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | public class GetterSetterExample { /** * Age of the person. Water is wet. */ private int age = 10 ; /** * Name of the person. */ private String name; @Override public String toString() { return String.format( "%s (age: %d)" , name, age); } /** * Age of the person. Water is wet. * * @return The current value of this person's age. Circles are round. */ public int getAge() { return age; } /** * Age of the person. Water is wet. * * @param age New value for this person's age. Sky is blue. */ public void setAge( int age) { this .age = age; } /** * Changes the name of this person. * * @param name The new value. */ protected void setName(String name) { this .name = name; } } |
@ToString
使用Lombok
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import lombok.ToString; @ToString public class ToStringExample { private static final int STATIC_VAR = 10 ; private String name; private Shape shape = new Square( 5 , 10 ); private String[] tags; @ToString .Exclude private int id; public String getName() { return this .name; } @ToString (callSuper= true , includeFieldNames= true ) public static class Square extends Shape { private final int width, height; public Square( int width, int height) { this .width = width; this .height = height; } } } |
不使用Lombok
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import java.util.Arrays; public class ToStringExample { private static final int STATIC_VAR = 10 ; private String name; private Shape shape = new Square( 5 , 10 ); private String[] tags; private int id; public String getName() { return this .name; } public static class Square extends Shape { private final int width, height; public Square( int width, int height) { this .width = width; this .height = height; } @Override public String toString() { return "Square(super=" + super .toString() + ", width=" + this .width + ", height=" + this .height + ")" ; } } @Override public String toString() { return "ToStringExample(" + this .getName() + ", " + this .shape + ", " + Arrays.deepToString( this .tags) + ")" ; } } |
@EqualsAndHashCode
使用Lombok
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import lombok.EqualsAndHashCode; @EqualsAndHashCode public class EqualsAndHashCodeExample { private transient int transientVar = 10 ; private String name; private double score; @EqualsAndHashCode .Exclude private Shape shape = new Square( 5 , 10 ); private String[] tags; @EqualsAndHashCode .Exclude private int id; public String getName() { return this .name; } @EqualsAndHashCode (callSuper= true ) public static class Square extends Shape { private final int width, height; public Square( int width, int height) { this .width = width; this .height = height; } } } |
不使用Lombok
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | import java.util.Arrays; public class EqualsAndHashCodeExample { private transient int transientVar = 10 ; private String name; private double score; private Shape shape = new Square( 5 , 10 ); private String[] tags; private int id; public String getName() { return this .name; } @Override public boolean equals(Object o) { if (o == this ) return true ; if (!(o instanceof EqualsAndHashCodeExample)) return false ; EqualsAndHashCodeExample other = (EqualsAndHashCodeExample) o; if (!other.canEqual((Object) this )) return false ; if ( this .getName() == null ? other.getName() != null : ! this .getName().equals(other.getName())) return false ; if (Double.compare( this .score, other.score) != 0 ) return false ; if (!Arrays.deepEquals( this .tags, other.tags)) return false ; return true ; } @Override public int hashCode() { final int PRIME = 59 ; int result = 1 ; final long temp1 = Double.doubleToLongBits( this .score); result = (result*PRIME) + ( this .name == null ? 43 : this .name.hashCode()); result = (result*PRIME) + ( int )(temp1 ^ (temp1 >>> 32 )); result = (result*PRIME) + Arrays.deepHashCode( this .tags); return result; } protected boolean canEqual(Object other) { return other instanceof EqualsAndHashCodeExample; } public static class Square extends Shape { private final int width, height; public Square( int width, int height) { this .width = width; this .height = height; } @Override public boolean equals(Object o) { if (o == this ) return true ; if (!(o instanceof Square)) return false ; Square other = (Square) o; if (!other.canEqual((Object) this )) return false ; if (! super .equals(o)) return false ; if ( this .width != other.width) return false ; if ( this .height != other.height) return false ; return true ; } @Override public int hashCode() { final int PRIME = 59 ; int result = 1 ; result = (result*PRIME) + super .hashCode(); result = (result*PRIME) + this .width; result = (result*PRIME) + this .height; return result; } protected boolean canEqual(Object other) { return other instanceof Square; } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现