文章16 | 阅读 7102 | 点赞0
在创建实体类的时候,通常我们要为成员变量(成员变量分为类变量和实例变量)创建getter和setter方法,这些方法千篇一律。下面是Student类的getter和setter方法。
public class Student {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
可以看到,setter方法的形参类型跟该方法所对应的成员变量类型相同,每个setter方法的访问控制符,返回类型,方法体都是一样的。getter方法的返回类型跟该方法所对应的成员变量类型相同,每个getter方法的访问控制符,形参,方法体都是一样的。这些类似的代码结构占据了一个实体类大量的篇幅,而且开发者和维护者都不关心这些方法的实现。所以,我们需要这样的一种工具既能让实体类拥有getter和setter方法,又不占据代码的篇幅。它就是lombok中的@Getter和@Setter注解。
@Getter和@Setter注解使用很简单,针对上面的Student类,我们对它使用@Getter和@Setter注解。
@Getter
@Setter
public class Student {
private String name;
private int age;
}
在Studnet类上加上@Getter和@Setter即可。
当然,你可以将注解加需要生成getter和setter方法的成员变量上。有同学可能会问,加在了类上,但是要某个成员变量生成特殊getter和setter怎么办?这个问题,可以直接手动编写该变量的getter和sette方法,当lombok检测到你已经为该变量编写了相应的getter和setter方法后,就不会再自动生成了。
将项目使用maven编译后,再打开Student.class文件。
package lombok;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/** * Put on any field to make lombok build a standard getter. * <p> * Complete documentation is found at <a href="https://projectlombok.org/features/GetterSetter">the project lombok features page for @Getter and @Setter</a>. * <p> * Even though it is not listed, this annotation also has the {@code onMethod} parameter. See the full documentation for more details. * <p> * Example: * <pre> * private @Getter int foo; * </pre> * * will generate: * * <pre> * public int getFoo() { * return this.foo; * } * </pre> * <p> * This annotation can also be applied to a class, in which case it'll be as if all non-static fields that don't already have * a {@code @Getter} annotation have the annotation. */
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Getter {
/** * If you want your getter to be non-public, you can specify an alternate access level here. * * @return The getter method will be generated with this access modifier. */
lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC;
/** * Any annotations listed here are put on the generated method. * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).<br> * up to JDK7:<br> * {@code @Getter(onMethod=@__({@AnnotationsGoHere}))}<br> * from JDK8:<br> * {@code @Getter(onMethod_={@AnnotationsGohere})} // note the underscore after {@code onMethod}. * * @return List of annotations to apply to the generated getter method. */
AnyAnnotation[] onMethod() default {};
boolean lazy() default false;
/** * Placeholder annotation to enable the placement of annotations on the generated code. * @deprecated Don't use this annotation, ever - Read the documentation. */
@Deprecated
@Retention(RetentionPolicy.SOURCE)
@Target({})
@interface AnyAnnotation {}
}
从上面的类注释(第十一行),我们可以看到完整的文档地址为:https://projectlombok.org/features/GetterSetter
元注解:从@Target({ElementType.FIELD, ElementType.TYPE}),我们可以知道这个注解可以应用在ElementType.FIELD和ElementType.TYPE上;@Retention(RetentionPolicy.SOURCE)表明注解的保留策略——只存在于源码中,编译后的class文件将不会出现。对于ElementType和RetentionPolicy枚举类不是很清楚的同学,先去补补课。
注解属性:value表明生成的方法的访问控制符,这个注解属性可以指定方法的访问控制符是public,还是private,或protected等等(更多内容参考lombok.AccessLevel枚举类)。
AnyAnnotation加了@Deprecated注解,表明它已经被弃用了,开发者不用关心它,目前还存在于源码中,只是作为一个占位符注释服务于onMethod属性。
onMethod注解属性参考Lombok实验室之onX使用。
lazy注解属性比较特殊,不是很常用,但是对于特殊的情况下很有效果。请参考Lombok之@Getter(lazy = true)使用。
package lombok;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/** * Put on any field to make lombok build a standard setter. * <p> * Complete documentation is found at <a href="https://projectlombok.org/features/GetterSetter">the project lombok features page for @Getter and @Setter</a>. * <p> * Even though it is not listed, this annotation also has the {@code onParam} and {@code onMethod} parameter. See the full documentation for more details. * <p> * Example: * <pre> * private @Setter int foo; * </pre> * * will generate: * * <pre> * public void setFoo(int foo) { * this.foo = foo; * } * </pre> * * <p> * This annotation can also be applied to a class, in which case it'll be as if all non-static fields that don't already have * a {@code Setter} annotation have the annotation. */
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Setter {
/** * If you want your setter to be non-public, you can specify an alternate access level here. * * @return The setter method will be generated with this access modifier. */
lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC;
/** * Any annotations listed here are put on the generated method. * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).<br> * up to JDK7:<br> * {@code @Setter(onMethod=@__({@AnnotationsGoHere}))}<br> * from JDK8:<br> * {@code @Setter(onMethod_={@AnnotationsGohere})} // note the underscore after {@code onMethod}. * * @return List of annotations to apply to the generated setter method. */
AnyAnnotation[] onMethod() default {};
/** * Any annotations listed here are put on the generated method's parameter. * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).<br> * up to JDK7:<br> * {@code @Setter(onParam=@__({@AnnotationsGoHere}))}<br> * from JDK8:<br> * {@code @Setter(onParam_={@AnnotationsGohere})} // note the underscore after {@code onParam}. * * @return List of annotations to apply to the generated parameter in the setter method. */
AnyAnnotation[] onParam() default {};
/** * Placeholder annotation to enable the placement of annotations on the generated code. * @deprecated Don't use this annotation, ever - Read the documentation. */
@Deprecated
@Retention(RetentionPolicy.SOURCE)
@Target({})
@interface AnyAnnotation {}
}
@Setter注解属性可参照@Getter的解释理解。其中,onParam注解属性参考Lombok实验室之onX使用。
本文已经收录在Lombok注解系列文章总览中,并继承上文中所提的特别说明。
源码地址:gitee
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/cauchy6317/article/details/102499709
内容来源于网络,如有侵权,请联系作者删除!