註釋。第 1 部分 — 有點無聊
在這一部分中,我決定接觸 Lombok 庫,因為它是原始碼註釋的著名代表。我將在下一篇文章中討論運行時註釋。
從前,有一個Java程式設計師。她每天都會寫普通的程式碼,像這樣:
至此,我希望您,我的讀者,已經感興趣,因為接下來將是一個簡短的介紹,並附有詳細資訊的連結。Lombok 還允許您自訂程式碼生成,例如並非總是需要所有 getter 和 setter,或者您可能需要不同的演算法來生成雜湊碼。為了實現這一點,有單獨的註釋(我認為其中許多都不需要描述): @Getter/@Setter、@ToString、@EqualsAndHashCode、@NoArgsConstructor、@RequiredArgsConstructor 和 @AllArgsConstructor、@Log 這些是最重要的常見的。整套作品可以在這裡
看到。特別注意 var 和 val。這意味著您可以編寫如下程式碼:

package lombok;
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
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;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
if (age != person.age) return false;
return name != null ? name.equals(person.name) : person.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
這個類別很普通——只有2個字段(畢竟,有時會有超過10-15個字段)。當然,這一切都可以在IDE中生成。但該死的,它取代了它的位置。如果有 15-20 個字段,每個字段都需要 getter、setter、constructor...在所有這些中,還有一些肉眼看不見的其他方法很容易丟失。我們如何幫助這位程式設計師寫得更快、更少?龍目島。與你一起出油鍋,一起入火。這是同一個類,但現在我們使用 Lombok:
package lombok;
@Data
public class Person {
private String name;
private int age;
}
就這樣。很酷吧?@Data註解有什麼作用?在編譯期間,此註解會為所有欄位產生 getter/setter,並根據標準規則覆寫 toString()、equals() 和 hashCode()。您可以在 IDE 中安裝該插件。它將看到尚未創建的任何方法。 
package lombok;
import lombok.experimental.var;
@Data
public class Person {
private String name;
private int age;
public static void main(String[] args) {
var person = new Person();
person.setAge(22);
System.out.println(person);
}
}
為什麼這是必要的?例如,我們有一個 RandomAccessFileChannel 類別。為什麼我們要寫這樣的程式碼?
RandomAccessFileChannel channel = new RandomAccessFileChannel();
如果我們能做到這一點?
var channel2 = new RandomAccessFileChannel();
在我看來,這並不總是可以接受的。例如,我們有一個邪惡的方法,它返回一個邪惡的地圖:
public static Map<List<Set<Integer>>, Set<List<String>>> evilMap() {
return new HashMap<>();
}
如果你這樣稱呼它:
Map<List<Set<Integer>>, Set<List<String>>> listSetMap = evilMap();
然後我們或多或少就清楚了我們正在做什麼。如果呼叫是這樣的:
var listSetMap = evilMap();
那麼只有魔鬼知道邪惡Map() 會回傳什麼,除非你查看方法本身,否則你不知道。為什麼要繞著源文件跑?一般來說,您需要小心這一點。 實驗分支: 這裡我想提一下@UtilityClass註解。它創建一個拋出異常的私有構造函數(因此骯髒的小手不會使用反射來幹預那裡)。它在類別的開頭非常漂亮——它告訴我們有實用方法。@Delegate註解實現了委託模式。假設您有一個類別將某些內容委託給另一個類,並且您僅對某些方法進行了更改 - 此註釋將使您免於重複方法,並且它將跟踪它們。如果您刪除或新增方法,此註釋將會注意到。 實驗註釋分支
GitHub
官方網站
為了使 IDE 能夠與 lombok 正常工作並且不將方法突出顯示為不存在,您必須安裝該插件。官方網站有一個設定
部分,您可以在其中看到如何為每個 IDE 連接插件。如您所見,lombok 很受歡迎:> 5,000 個星和 > 1,000 個分叉。Spring 在其類別中使用 lombok。如果你的專案中有 Spring,請看一下——它可能在你不知情的情況下引入了 lombok。
GO TO FULL VERSION