免费在线a视频-免费在线观看a视频-免费在线观看大片影视大全-免费在线观看的视频-色播丁香-色播基地

答應我,試試IDEA的這款插件,不要在代碼中出現大量的set/get方法了...

:2020年03月26日 Java面試那些事兒
分享到:

# 前言what?你的 Java 代碼中還充斥著大量的 set/get 方法?我們在剛開始學習 Java 語言的時候講過,面向對象的三大特征就是封裝,繼承,和多態。在 Java 中,要保證封裝性,需要將成員變量私有化,對外...

# 前言

what?你的 Java 代碼中還充斥著大量的 set/get 方法?

我們在剛開始學習 Java 語言的時候講過,面向對象的三大特征就是封裝,繼承,和多態。在 Java 中,要保證封裝性,需要將成員變量私有化,對外提供 set/get 方法來訪問,雖然現在的 IDE,像 eclipse,IDEA都提供了快捷鍵,來生成 set/get 方法,但是在做項目的時候,一個 JavaBean 往往會有很多的成員變量,一個變量對應兩個方法,如果有10幾個成員變量,那么會對應20多個方法,也許還要去寫構造器、equals 等方法,而且需要維護。這樣一來,會使代碼變得非常冗余,這些顯得很冗長也沒有太多技術含量,一旦修改屬性,就容易出現忘記修改對應方法的失誤。

我在看大佬的項目的源碼的時候,看到他們的代碼中都沒有 set/get 方法,取而代之的是在 JavaBean 上標注的注解,我感到非常的好奇,原來他們是用了一種叫做 Lombok 的插件,便去詳細了解了這個插件。

# Lombok背景介紹

官方介紹如下:

Project Lombok makes java a spicier language by adding 'handlers' that know how to build and compile simple, boilerplate-free, not-quite-java code.

大致意思是 Lombok 通過增加一些“處理程序”,可以讓 Java 變得簡潔、快速。

# Lombok使用方法

Lombok 能通過注解的方式,在編譯時自動為屬性生成構造器、getter/setter、equals、hashcode、toString 方法。出現的神奇就是在源碼中沒有 getter 和 setter 方法,但是在編譯生成的字節碼文件中有 getter 和 setter 方法。這樣就省去了手動重建這些代碼的麻煩,使代碼看起來更簡潔些。

Lombok 的使用跟引用 jar 包一樣,可以在官網(https://projectlombok.org/download)下載 jar 包,也可以使用 maven 添加依賴:

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

<version>1.18.10</version>

<scope>provided</scope>

</dependency>

注意:

第一次使用 Lombok 插件需要做如下幾步配置

將 Lombok 插件安裝到 IDEA

file -> setting

選中 Plugins,搜索 Lombok,點擊 Install

選擇默認的編譯方式為 javac,因為 eclipse 是不支持 Lombok 的編譯方式的,javac 支持 Lombok 的編譯方式。

打開注解生成器 Enable annotation processing

再次注意:

IntelliJ IDEA 2019.2(也就是我用的版本)默認是不支持 Lombok 插件的,需要去

https://plugins.jetbrains.com/plugin/6317-lombok/versions

下載對應版本的插件,然后手動引入,在 IDEA 中選擇 File -> Setting -> plugins 找到 Install Plugin from Disk…(注意版本不同位置可能有所差異)

接下來我們來分析 Lombok 中注解的具體用法

@Data

@Data 注解在類上,會為類的所有屬性自動生成 setter/getter、equals、canEqual、hashCode、toString 方法,如為 final 屬性,則不會為該屬性生成 setter 方法。

比如我們寫一個學生類

@Data

public class Student {

private String name;

private Integer age;

private Integer id;

private String major;

}

這樣就可以調用 set/get 方法了。

@Getter/@Setter

如果覺得@Data 太過殘暴(因為@Data 集合了@ToString、@EqualsAndHashCode、@Getter/@Setter、@RequiredArgsConstructor 的所有特性)不夠精細,可以使用@Getter/@Setter 注解,此注解在屬性上,可以為相應的屬性自動生成 set/get 方法。

public class Student {

@Setter private String name;

private Integer age;

private Integer id;

private String major;

public static void main(String[] args) {

Student stu = new Student();

stu.setName("Mr.ml");

}

}

@NonNull

該注解用在屬性或構造器上,Lombok 會生成一個非空的聲明,可用于校驗參數,能幫助避免空指針。

public class Student {

@Setter private String name;

private Integer age;

private Integer id;

private String major;

public Student(@NonNull String name) {

this.name = name;

}

}

@Cleanup

該注解能幫助我們自動調用 close() 方法,很大的簡化了代碼。

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);

}

}

}

@EqualsAndHashCode

默認情況下,會使用所有非靜態(non-static)和非瞬態(non-transient)屬性來生成 equals 和 hashCode,也能通過 exclude 注解來排除一些屬性。

@EqualsAndHashCode(exclude={"id", "shape"})

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;

}

@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;

}

}

}

@ToString

類使用@ToString 注解,Lombok 會生成一個 toString() 方法,默認情況下,會輸出類名、所有屬性(會按照屬性定義順序),用逗號來分割。

通過將 includeFieldNames 參數設為 true,就能明確的輸出 toString() 屬性。這一點是不是有點繞口,通過代碼來看會更清晰些。

@ToString(exclude="id")

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.getName();

}

@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;

}

}

}

NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor

無參構造器、部分參數構造器、全參構造器。Lombok沒法實現多種參數構造器的重載。

@RequiredArgsConstructor(staticName = "of")

@AllArgsConstructor(access = AccessLevel.PROTECTED)

public class ConstructorExample<T> {

private int x, y;

@NonNull private T description;

@NoArgsConstructor

public static class NoArgsExample {

@NonNull private String field;

}

}

[我要糾錯]
[ 編輯:王振袢 &發表于江蘇 ]
關鍵詞: 前言 what 你的 Java 代碼

來源:本文內容搜集或轉自各大網絡平臺,并已注明來源、出處,如果轉載侵犯您的版權或非授權發布,請聯系小編,我們會及時審核處理。
聲明:江蘇教育黃頁對文中觀點保持中立,對所包含內容的準確性、可靠性或者完整性不提供任何明示或暗示的保證,不對文章觀點負責,僅作分享之用,文章版權及插圖屬于原作者。

點個贊
0
踩一腳
0

您在閱讀:答應我,試試IDEA的這款插件,不要在代碼中出現大量的set/get方法了...

Copyright©2013-2025 ?JSedu114 All Rights Reserved. 江蘇教育信息綜合發布查詢平臺保留所有權利

蘇公網安備32010402000125 蘇ICP備14051488號-3技術支持:南京博盛藍睿網絡科技有限公司

南京思必達教育科技有限公司版權所有   百度統計

主站蜘蛛池模板: 国产一区二区三区欧美 | 天堂亚洲网 | 亚洲国产日韩欧美在线a乱码 | 麻豆一区二区三区四区 | 羞羞视频免费网站含羞草 | 国产麻豆va精品视频 | 亚欧精品一区二区三区四区 | 日xxxx| 亚洲视频自拍偷拍 | 大美香蕉伊在看欧美 | 天天射天天操天天干 | 天天草天天爽 | 香港三级日本三级澳门三级人 | 亚洲日本aⅴ片在线观看香蕉 | 日韩成人精品日本亚洲 | 国产麻豆一级在线观看 | 激情综合亚洲欧美日韩 | 欧美成一级 | 亚洲视频精品在线 | 五月天激情综合小说专区 | 日韩一区在线播放 | 久久艹人人艹 | 亚洲欧美日韩在线观看二区 | sea8国产精品视频 | 123456成年免费视频 | 中文字幕天天躁日日躁狠狠躁免费 | a级毛片无码免费真人 | 伊人第一页 | 日本一区二区三区在线 视频 | 国产麻豆免费 | 日韩精品一区二区三区不卡 | 香焦视频在线观看黄 | 久久综合久久综合久久综合 | 成人黄视频在线观看 | 欧美精品在线观看视频 | 在线视频一区二区三区 | 免费在线观看色 | 小明在看看永久免费平台 | 涩涩精品 | 男人日批视频 | 日韩欧美亚洲国产高清在线 |
最熱文章
最新文章
  • 阿里云上云鉅惠,云產品享最低成本,有需要聯系,
  • 卡爾蔡司鏡片優惠店,鏡片價格低
  • 蘋果原裝手機殼