自從學(xué)了這招描沟,再也沒有寫過 Get 和 Set 方法了

我們在平常開發(fā)中查剖,最令我們心煩的事情钾虐,就是 Bean 類的 Get 和 Set 方法了,雖然 Studio 上面有自動幫我們生成 Get 和 Set 的工具笋庄,但是這種方式其實也有弊端效扫,那就是我們在 Review Bean 類代碼的時候,特別是有內(nèi)部類的情況下直砂,這些 Get 和 Set 方法其實給我們造成了一些 Review 障礙菌仁,其實這些 Get 和 Set 方法沒有什么營養(yǎng),經(jīng)過自動生成后基本不會再管了静暂。

那我們有沒有一種更好的方式來做這件事济丘?答案當(dāng)然是有的,接下來讓我們直接進入主題洽蛀。

為了更好的理解新舊寫法之間的差異摹迷,這里列舉了兩種關(guān)于寫法進行比較

寫法一

public class UserBean {

    private DataBean data;
    private CookieBean cookie;
    private int newUser;
    private int smsStatus;
    private boolean isTest;
    private String unionid;
    private String openid;

    public String getUnionid() {
        return unionid;
    }

    public void setUnionid(String unionid) {
        this.unionid = unionid;
    }

    public String getOpenid() {
        return openid;
    }

    public void setOpenid(String openid) {
        this.openid = openid;
    }

    public DataBean getData() {
        return data;
    }

    public void setData(DataBean data) {
        this.data = data;
    }

    public CookieBean getCookie() {
        return cookie;
    }

    public void setCookie(CookieBean cookie) {
        this.cookie = cookie;
    }

    public int getNewUser() {
        return newUser;
    }

    public void setNewUser(int newUser) {
        this.newUser = newUser;
    }

    public int getSmsStatus() {
        return smsStatus;
    }

    public void setSmsStatus(int smsStatus) {
        this.smsStatus = smsStatus;
    }

    public boolean isTest() {
        return isTest;
    }

    public void setTest(boolean test) {
        isTest = test;
    }

    public static class DataBean {

        private String id;
        private String name;
        private String nickname;
        private int sex;
        private String mobile;
        private int mobile_bind;
        private String score;
        private String parentName;
        private String relation;
        private String birthday;
        private String avatarPath;
        private int attendClass;
        private int is_new_user;

        public int getMobile_bind() {
            return mobile_bind;
        }

        public void setMobile_bind(int mobile_bind) {
            this.mobile_bind = mobile_bind;
        }

        public int getIs_new_user() {
            return is_new_user;
        }

        public void setIs_new_user(int is_new_user) {
            this.is_new_user = is_new_user;
        }

        public int getAttendClass() {
            return attendClass;
        }

        public void setAttendClass(int attendClass) {
            this.attendClass = attendClass;
        }

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getNickname() {
            return nickname;
        }

        public void setNickname(String nickname) {
            this.nickname = nickname;
        }

        public int getSex() {
            return sex;
        }

        public void setSex(int sex) {
            this.sex = sex;
        }

        public String getMobile() {
            return mobile;
        }

        public void setMobile(String mobile) {
            this.mobile = mobile;
        }

        public String getScore() {
            return score;
        }

        public void setScore(String score) {
            this.score = score;
        }

        public String getParentName() {
            return parentName;
        }

        public void setParentName(String parentName) {
            this.parentName = parentName;
        }

        public String getRelation() {
            return relation;
        }

        public void setRelation(String relation) {
            this.relation = relation;
        }

        public String getBirthday() {
            return birthday;
        }

        public void setBirthday(String birthday) {
            this.birthday = birthday;
        }

        public String getAvatarPath() {
            return avatarPath;
        }

        public void setAvatarPath(String avatarPath) {
            this.avatarPath = avatarPath;
        }
    }

    public static class CookieBean {

        private String uid;
        private String time;
        private String token;

        public String getUid() {
            return uid;
        }

        public void setUid(String uid) {
            this.uid = uid;
        }

        public String getTime() {
            return time;
        }

        public void setTime(String time) {
            this.time = time;
        }

        public String getToken() {
            return token;
        }

        public void setToken(String token) {
            this.token = token;
        }
    }
}

寫法二

@Setter
@Getter
public class UserBean {

    private DataBean data;
    private CookieBean cookie;
    private int newUser;
    private int smsStatus;
    private boolean isTest;
    private String unionid;
    private String openid;

    @Setter
    @Getter
    public static class DataBean {

        private String id;
        private String name;
        private String nickname;
        private int sex;
        private String mobile;
        private int mobile_bind;
        private String score;
        private String parentName;
        private String relation;
        private String birthday;
        private String avatarPath;
        private int attendClass;
        private int is_new_user;
    }

    @Setter
    @Getter
    public static class CookieBean {

        private String uid;
        private String time;
        private String token;
    }
}

寫法 PK

經(jīng)過比較,第一種寫法代碼行數(shù)有 218 行郊供,而第二種寫法代碼行數(shù)僅有 40 行代碼峡碉,很明顯第二種寫法清爽了許多。

假設(shè)是你驮审,會選擇哪一種鲫寄?如果是我,會毫不猶豫選擇第二種头岔。一個注解居然可以少寫很多代碼塔拳,性價比真的很高鼠证。

這個時候你可能會有些疑問峡竣,這個到底是怎么實現(xiàn)的?會不會影響性能量九?有沒有什么缺點适掰?

帶著這些疑問讓我們開始講今天的主角:lombok颂碧,先講講如何集成和使用

集成使用

在 Gradle 中添加依賴

dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.12'
    annotationProcessor 'org.projectlombok:lombok:1.18.12'
}

你以為到這里就結(jié)束了?其實不然类浪,這個功能還需要插件的支持

安裝成功之后提示重啟载城,我們選擇重啟即可

注解解釋

  • @Getter:為這個類的字段自動生成 Get 方法

  • @Setter:為這個類的字段自動生成 Set 方法

  • @ToString:為這個類自動生成 toString 方法

  • @NoArgsConstructor:為這個類自動生成一個空參構(gòu)造函數(shù)

  • @AllArgsConstructor:根據(jù)這個類的字段自動生成一個全參構(gòu)造函數(shù)

  • @RequiredArgsConstructor:為這個類自動生成特定的構(gòu)造函數(shù),構(gòu)造函數(shù)中的參數(shù)是被 final 修飾又或者 @NonNull 約束的字段

  • @EqualsAndHashCode:根據(jù)這個類的字段自動生成 equals 和 hashCode 方法费就,需要注意的是 hashCode 是通過字段的值計算得來的

  • @Data:相當(dāng)于同時使用了 @Getter诉瓦、@Setter、@ToString力细、@EqualsAndHashCode睬澡、@RequiredArgsConstrutor

原理

  • Lombok 有點類似于 APT,但其實它并不是 APT眠蚂,因為 APT 無法修改類的內(nèi)容煞聪,只能通過生成輔助類來完成。也有點類似于 AOP逝慧,但是 AOP 只針對方法進行切面昔脯,而 Lombok 是在編譯時通過修改 class 文件生成的內(nèi)容,也就是在 java 轉(zhuǎn)換成 class 之前做修改笛臣,所以基于這一實現(xiàn)原理云稚,Lombok 對性能沒有任何影響。

  • Lombok本質(zhì)上就是一個實現(xiàn)了 JSR 269 API 的程序沈堡。在使用 javac 的過程中碱鳞,它產(chǎn)生作用的具體流程如下:

    • javac 對源代碼進行分析,生成了一棵抽象語法樹(AST)

    • 運行過程中調(diào)用實現(xiàn)了 JSR 269 API 的 Lombok 程序

    • 此時 Lombok 就對第一步驟得到的 AST 進行處理踱蛀,找到注解所在類對應(yīng)的語法樹(AST)窿给,然后修改該語法樹(AST),增加注解所定義的相應(yīng)樹節(jié)點

    • javac 使用修改后的抽象語法樹(AST)生成字節(jié)碼文件率拒,即給 class 增加新的節(jié)點(代碼塊)

優(yōu)缺點

  • 優(yōu)點

    • 相比傳統(tǒng)手寫崩泡,這種方式更加快捷

    • 相比自動生成,這種方式更加簡潔

  • 缺點

    • 如果是團隊開發(fā)猬膨,需要每一個項目成員安裝此插件角撞,否則無法編譯通過

Android 技術(shù)討論 Q 群:10047167

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市勃痴,隨后出現(xiàn)的幾起案子谒所,更是在濱河造成了極大的恐慌,老刑警劉巖沛申,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劣领,死亡現(xiàn)場離奇詭異,居然都是意外死亡铁材,警方通過查閱死者的電腦和手機尖淘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門奕锌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人村生,你說我怎么就攤上這事惊暴。” “怎么了趁桃?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵辽话,是天一觀的道長。 經(jīng)常有香客問我卫病,道長屡穗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任忽肛,我火速辦了婚禮村砂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屹逛。我一直安慰自己础废,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布罕模。 她就那樣靜靜地躺著评腺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪淑掌。 梳的紋絲不亂的頭發(fā)上蒿讥,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音抛腕,去河邊找鬼芋绸。 笑死,一個胖子當(dāng)著我的面吹牛担敌,可吹牛的內(nèi)容都是我干的摔敛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼全封,長吁一口氣:“原來是場噩夢啊……” “哼马昙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起刹悴,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤行楞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后土匀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體子房,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年恒削,在試婚紗的時候發(fā)現(xiàn)自己被綠了池颈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尾序。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡钓丰,死狀恐怖躯砰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情携丁,我是刑警寧澤琢歇,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站梦鉴,受9級特大地震影響李茫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肥橙,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一魄宏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧存筏,春花似錦宠互、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至善茎,卻和暖如春券册,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背垂涯。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工烁焙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耕赘。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓考阱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鞠苟。 傳聞我的和親對象是個殘疾皇子乞榨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容