2021-02-09 考个与Lombok有关的题目

第一题

请问以下代码输出的结果是什么?
a. true true
b. false false
c. true false
d. false true

import com.google.common.collect.Sets;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;

import java.util.Set;

public class Demo {

    @Getter
    @Setter
    public static class Father {
        private Long id;
    }

    @Data
    public static class Son extends Father {
        private String name;
    }

    public static void main(String[] args) {
        Set<Father> set = Sets.newHashSet();

        Son s1 = new Son();
        s1.setId(1L);
        s1.setName("1");
        System.out.println(set.add(s1));

        Son s2 = new Son();
        s2.setId(2L);
        s2.setName("1");
        System.out.println(set.add(s2));
    }
}

答案:c. true false

第一个输出为true无需多言
第二个输出为何为false?

认知中,s1和s2的id属性值不同
先查下@Data的注释

/**
 * Generates getters for all fields, a useful toString method, and hashCode and equals implementations that check
 * all non-transient fields. Will also generate setters for all non-final fields, as well as a constructor.
 * <p>
 * Equivalent to {@code @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode}.
 * <p>
 * Complete documentation is found at <a href="https://projectlombok.org/features/Data.html">the project lombok features page for &#64;Data</a>.
 * 
 * @see Getter
 * @see Setter
 * @see RequiredArgsConstructor
 * @see ToString
 * @see EqualsAndHashCode
 * @see lombok.Value
 */

@Data等价于组合使用
@Setter @Getter @RequiredArgsConstructor @ToString @EqualsAndHashCode

来看下@EqualsAndHashCode的源码中的callSuper()方法

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface EqualsAndHashCode {
   /**
     * Call on the superclass's implementations of {@code equals} and {@code hashCode} before calculating
     * for the fields in this class.
     * <strong>default: false</strong>
     */
    boolean callSuper() default false;
}

可以知道,只添加@Data注解的类,默认不会调用父类的equals/hashCode方法
上面的例子中,在比较s1和s2的时候,只比较了name字段,发现相同,故s2不会被加入Set中。

使用IDEA的小伙伴,当在子类使用了@Data后,应该会看到这个提示

IDEA泛黄提示

提示说明了,@Data带来的@EqualsAndHashCode,在生成equals/hashCode方法时,默认不调用其父类的equals/hashCode方法
即使它的父类不是java.lang.Object
并且建议你显示添加@EqualsAndHashCode(callSuper = false),证明你确实不打算调用父类的方法是(intentional,故意的),以消除这个泛黄的提示

至于为什么@EqualsAndHashCode要这么做?
你想啊,当你写一个类,默认继承java.lang.Object
当你加了@EqualsAndHashCode注解,若是默认调用了父类(java.lang.Object)的equals/hashCode方法,那还有意义吗?
Lombok不会帮你去判断这个类的父类是不是java.lang.Object,直接默认不调用父类完事儿
当然这也延伸出一种使用标准,就是使用@Data的类,不要有继承关系

但本质上,是要学会自己用
——鲁迅(并没有说过)

第二题

接下来,手动在Son类加上@EqualsAndHashCode(callSuper = true),示意要调用父类的方法,并稍微修改了属性值

请问以下代码输出的结果是什么?
a. true true
b. false false
c. true false
d. false true

import com.google.common.collect.Sets;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

import java.util.Set;

public class Demo2 {

    @Getter
    @Setter
    public static class Father {
        private Long id;
    }

    @EqualsAndHashCode(callSuper = true)
    @Data
    public static class Son extends Father {
        private String name;
    }

    public static void main(String[] args) {
        Set<Father> set = Sets.newHashSet();

        Son s1 = new Son();
        s1.setId(1L);
        s1.setName("1");
        System.out.println(set.add(s1));

        Son s2 = new Son();
        s2.setId(1L);
        s2.setName("1");
        System.out.println(set.add(s2));
    }
}

答案:a. true true
第一个输出true无需多言
第二个,为何是true?两个对象的id和name属性都相同,不是调用父类的equals/hashCode方法了吗?

嗯,问题就在这,你看父类的equals/hashCode方法重写了吗?
没重写,所以父类调用的实际是java.lang.Object的equals/hashCode方法

public class Object {
    public boolean equals(Object obj) {
        return (this == obj);
    }

    public native int hashCode();
}

总结:
Lombok确实很好用,但也有不少大佬说Lombok带来了很多坑。


大佬的聊天记录

使用Lombok,代码虽然简化了,但肯定会隐藏一些细节。这些细节对于有一定资历的程序员来说是烂熟于心的,但对于新入行的同学,以及刚接触Lombok的同僚来说确实不太友好。

像我目前的项目,如果没有lombok,每写/改一个字段就要连带一个getter和setter,相当于工作量直接翻三倍。

另一方面,Lombok的@Builder方法我个人就觉得很鸡肋

不仅影响了这个类的构造方法(@Builder的实现需要依赖于这个类必须有个全参构造方法,而类的构造方法有可能会影响到其他的一些中间件使用)

而且跟一行行的Set属性没什么本质区别,并不能节约多少代码
(当然业务不同吧,也不否认首次用@Builder敲代码会很爽,但爽过之后是要还债的)

看了下@Builder实现,还多用了个中间类去承载属性值,之后统一通过构造方法注入,站在执行方法栈的角度看也会觉得是多此一举

个人认为,轮子坑不坑,好不好用是一方面,自己对这些轮子的了解程度如何也占很大比重。

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

推荐阅读更多精彩内容

  • 闲话 “程序猿”、“码农”、“软件攻城狮”,程序员这个职业现在已经被这些网络流行语给玩坏了。由于程序员门槛越来越低...
    程序员吉森阅读 1,819评论 0 8
  • 一、简述 lombok是一款在Java开发中简洁化代码的插件工具。使用lombok注解,目的就在于不用再去写一些反...
    Djbfifjd阅读 4,341评论 0 2
  • 1. 什么是lombok 官网原话 : Project Lombok is a java library that...
    studymachine阅读 1,443评论 0 0
  • lombok版本:1.18.2 注解 @AllArgsConstructor 作用 生成包含所有字段的构造器 参数...
    西三旗靓仔阅读 1,765评论 0 1
  • 夜莺2517阅读 127,719评论 1 9