Lombok

注解 说明
@Data 用在类上,提供Getter、Setter、equals、hasCode、toString 、构造方法(参数:@NonNull和final字段
@AllArgsConstructor 用在类上,提供全参数构造方法
@NoArgsConstructor 用在类上,提供无参构造方法
@RequiredArgsConstructor 用在类上,提供构造方法(参数:@NonNull和final字段
@Value 用在类上,提供 get、equals、hashCode、toString、全参数构造方法
@EqualsAndHashCode 用在类上,提供equals、hasCode方法,继承父类使用 @EqualsAndHashCode(callSuper = true)
@NonNull 用在字段上,提供无参构造方法,为空则抛出NullPointerException
@Cleanup 用在字段上,释放资源,try{}finally{}
@SneakyThrows 用在类上,捕获异常,指定异常@SneakyThrows(Exception.class)

注解 @Getter @Setter@Getter 支持懒加载

@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Getter {
    lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC;
    AnyAnnotation[] onMethod() default {};
    boolean lazy() default false;
}
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Setter {
    lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC;
    AnyAnnotation[] onMethod() default {};
    AnyAnnotation[] onParam() default {};
}
AccessLevel 描述
PUBLIC 生成 public 修饰的 getter setter 方法
MODULE 生成没有修饰符修饰的 getter setter 方法
PROTECTED 生成 protected 修饰的 getter setter 方法
PACKAGE 生成没有修饰符修饰的 getter setter 方法
PRIVATE 生成 private 修饰的 getter setter 方法
NONE 不生成 getter setter 方法

注解 @EqualsAndHashCode

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface EqualsAndHashCode {
    String[] exclude() default {};
    String[] of() default {};
    boolean callSuper() default false;
    boolean doNotUseGetters() default false;
}
属性 描述
exclude 在生成的 equalshashCode 方法中排除的字段
of 在生成的 equalshashCode 方法中列出的字段
callSuper 属性设置为 true,表示父类的 equalshashCode 参与计算,默认为 false
doNotUseGetters 通常都是通过字段的 getter 方法获取字段值,设置为 true,表示不通过 getter 方法获取,而是直接访问字段值,默认为 false

注解 @Accessors ,配合 @Setter、@Getter 、@Data注解,用在类上和字段上

属性 描述
fluent 默认为 false,如果为 true 则生成的 getter/setter 方法没有 set/get 前缀,如果为 true, chain 未设置,则 chain 会被设置为 true
chain 默认为 falsesetter 方法返回是 void,如果为 true 则返回this,当 fluenttrue 时,chain 会设置为 true
prefix getter setter方法时会去掉指定的前缀

注解 Log

注解 描述
@CommonsLog org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class)
@JBossLog org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.class)
@Log java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName())
@Log4j org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class)
@Log4j2 org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class)
@Slf4j org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class)
@XSlf4j org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class)

详情见 使用 Lombok 进行 Java 开发
使用 @Data 会遇到什么坑,看下 MybatisPropertyNamer 类 ,methodToProperty 方法转属性

  public static String methodToProperty(String name) {
     // is开头的一般是bool类型,直接从第二个(索引)开始截取
    if (name.startsWith("is")) {
      name = name.substring(2);
    // set get的就从第三个(索引)开始截取
    } else if (name.startsWith("get") || name.startsWith("set")) {
      name = name.substring(3);
    }
    return name;
  }

测试

@Data
public class Test {
    private boolean isTrue;
    private String mName;
    private Boolean isFalse;

    public static void main(String[] args) {
        Test test = new Test();
        test.getMName(); // mName 属性的 get 方法
        test.isTrue(); // isTrue 属性的  get 方法

        System.out.println(PropertyNamer.methodToProperty("getMName")); // 打印 MName 属性 (错误)
        System.out.println(PropertyNamer.methodToProperty("isTrue")); // 打印 true 属性 (错误)

        test.getIsFalse();
        System.out.println(PropertyNamer.methodToProperty("getIsFalse")); // 打印 isFalse 属性  (正确)
    }
}

可以看出 Mybatis@Data 生成的方法转属性之后,跟原属性对不上,所以使用的时候, boolean 类型 不要 is加大写字母命名,其它基本类型属性不要 第一个字母小写 第二个字母大写 命名
如果类实现 Serializable接口, boolean 类型的字段命令为 isTrue 的会有问题 ,字段序列号后是 true

如果要 Builder 链式调用父类的字段 ,父类和子类都要加 @SuperBuilder
Coffee.builder().name("name").id(100L).build();

@SuperBuilder
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class Coffee extends BaseEntity implements Serializable {
    @NotBlank(message = "name can not be null") //只能作用在 String 上,不能为null, 而且调用trim()后, 长度必须大于0
    private String name;
}
@SuperBuilder
@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
public class BaseEntity implements Serializable {
    private long id;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容