lombok和maven_Lombok,AutoValue和Immutables,或如何编写更少,更好的代码返回
lombok和maven
在上一篇有關Lombok庫的文章中 ,我描述了一個庫,該庫有助于處理Java中的樣板代碼( 是的,我知道這些問題已經在Kotlin中解決了 ,但這是現實生活,我們不能一味地坐下來,一旦出現較新或更簡單的語言,請重寫每個現有項目。 但是生活中有很多事情, Lombok項目有其替代方案。 讓我們也給他們一個機會。
本文的代碼示例可在此處和此處找到。
它實際上是Lombok的替代方案-因為您不能一次使用兩者。 或者,至少事實證明,在同一個項目中同時使用IntelliJ IDEA和IntelliJ IDEA時,您將遇到很多困難,因為這是許多人真正選擇的IDE,因為這兩個庫處理批注處理的方式不同。 因此,兩個人都無法生存,而另一個人則得以幸存,這大約是哈利·波特和伏地魔的預言所表達的方式 。
因此,我們已經知道使用Lombok批注的Person類的外觀 :
@Builder(toBuilder = true) @ToString @EqualsAndHashCode @AllArgsConstructor(access = AccessLevel.PRIVATE) public class Person {@NonNull@Getterprivate final String lastName;@NonNull@Getterprivate final String firstName;@NonNull@Getterprivate final Integer age; }如果我們創建一個新項目并按此處所述使用autovalue ,則可以使用AutoValue Builders模仿幾乎相同的模型 。
現在讓我們看一下AutoValue模型的外觀:
package autovalue.model;import com.google.auto.value.AutoValue;@AutoValue public abstract class Person {public abstract String lastName();public abstract String firstName();public abstract Integer age();public static Person create(String lastName, String firstName, Integer age) {return builder().lastName(lastName).firstName(firstName).age(age).build();}public static Builder builder() {return new AutoValue_Person.Builder();}@AutoValue.Builderpublic abstract static class Builder {public abstract Builder lastName(String lastName);public abstract Builder firstName(String firstName);public abstract Builder age(Integer age);public abstract Person build();} }您可以看到的是, 肯定有更多的代碼 。
Lombok生成帶有單個注釋的構建器時, AutoValue將使您創建自己的構建器代碼-盡管不是全部。 基本上,您定義接口后,實現將由AutoValue生成的代碼完成,您不必實際實現getter和setter中的代碼。 即使我們同意AutoValue getter接口不會比Lombok字段定義花費更多的時間或空間,但是對于某些人來說,編寫AutoValue構建器代碼仍然是一件麻煩事。
但是,它可以提供更大的靈活性 ,因為您實際上可以更改構建器方法名稱。 此外, 代碼分析和使用情況搜索是一個巨大的勝利–這樣,您實際上可以分別查找實際的getter和setter的用法,這對開發人員也可能很重要。
實例的創建方法與Lombok相同。
final Person anna = Person.builder().age(31).firstName("Anna").lastName("Smith").build();我們所有的測試都在代碼更改最少的情況下運行,主要是因為AutoValue無法將實例轉換為構建器(或者至少我不容易找到它),因此復制只是調用靜態工廠方法:
package autovalue.model;import org.junit.Test;import static org.assertj.core.api.Java6Assertions.assertThat;public class PersonTest {private static Person JOHN = Person.builder().firstName("John").lastName("Doe").age(30).build();private static Person JANE = Person.builder().firstName("Jane").lastName("Doe").age(30).build();@Testpublic void testEquals() throws Exception {Person JOHN_COPY = Person.create(JOHN.lastName(), JOHN.firstName(), JOHN.age());assertThat(JOHN_COPY).isEqualTo(JOHN);}@Testpublic void testNotEquals() throws Exception {assertThat(JANE).isNotEqualTo(JOHN);}@Testpublic void testHashCode() throws Exception {Person JOHN_COPY = Person.create(JOHN.lastName(), JOHN.firstName(), JOHN.age());assertThat(JOHN_COPY.hashCode()).isEqualTo(JOHN.hashCode());}@Testpublic void testHashCodeNotEquals() throws Exception {Person JOHN_COPY = Person.create(JOHN.lastName(), JOHN.firstName(), JOHN.age());assertThat(JOHN_COPY.hashCode()).isNotEqualTo(JANE.hashCode());}@Testpublic void testToString() throws Exception {String jane = JANE.toString();assertThat(jane).contains(JANE.lastName());assertThat(jane).contains(JANE.firstName());assertThat(jane).contains("" + JANE.age());assertThat(jane).doesNotContain(JOHN.firstName());}}其他顯而易見的區別:
- 您編寫的AutoValue類始終是抽象的。 它們在AutoValue生成的代碼中實現。
- AutoValue類是自動不可變的。 有一種解決方法,使它們具有不可變類型的屬性 。 即使您明確希望在實例上具有setter, 也不能 。
為什么要使用AutoValue ? AutoValue的創建者會謹慎地在此處描述該庫的收益,甚至就此創建一個完整的演示文稿 。
該庫還使用Java注釋處理器來生成簡單,安全和一致的值對象。 好吧,與前兩個相同。 還有什么是新的? 讓我們來看看。
最簡單的值類如下所示。
package immutables.model;import org.immutables.value.Value;@Value.Immutable public abstract class Person {public abstract String lastName();public abstract String firstName();public abstract Integer age(); }因此,具有抽象類的相同原理僅在生成的代碼中實現。 為此,您需要啟用IDE注釋處理器 ,就像對Lombok一樣 (但對于AutoValue則不需要,因為它是由gradle插件完成的)。
那么,對象創建的外觀如何?
final Person anna = ImmutablePerson.builder().age(31).firstName("Anna").lastName("Smith").build(); System.out.println(anna);乍一看,最明顯的區別是:
- 我們不聲明構建器方法。
- 靜態的builder / factory方法不是在我們自己的類上創建的,而是在生成的類上創建的。
- 與AutoValue一樣,無法在類上生成生成器,只能在生成器上生成。
- 生成的類也自動 -ers,就是實例方法,允許通過改變一個屬性來創建實例的副本補充說:
- 該構建器具有自動添加的from()方法,該方法允許創建實例的精確副本,并且在生成的類上還有一個生成的靜態copyOf()方法:
同樣,我們的測試運行時所做的更改很小,主要是關于如何復制實例的:
package immutables.model;import org.junit.Test;import static org.assertj.core.api.Assertions.assertThat;public class PersonTest {private static Person JOHN = ImmutablePerson.builder().firstName("John").lastName("Doe").age(30).build();private static Person JANE = ImmutablePerson.builder().firstName("Jane").lastName("Doe").age(30).build();@Testpublic void testEquals() throws Exception {//ImmutablePerson JOHN_COPY = ImmutablePerson.builder().from(JOHN).build();Person JOHN_COPY = ImmutablePerson.copyOf(JOHN);assertThat(JOHN_COPY).isEqualTo(JOHN);}@Testpublic void testNotEquals() throws Exception {assertThat(JANE).isNotEqualTo(JOHN);}@Testpublic void testHashCode() throws Exception {Person JOHN_COPY = ImmutablePerson.copyOf(JOHN);assertThat(JOHN_COPY.hashCode()).isEqualTo(JOHN.hashCode());}@Testpublic void testHashCodeNotEquals() throws Exception {Person JOHN_COPY = ImmutablePerson.copyOf(JOHN);assertThat(JOHN_COPY.hashCode()).isNotEqualTo(JANE.hashCode());}@Testpublic void testToString() throws Exception {String jane = JANE.toString();assertThat(jane).contains(JANE.firstName());assertThat(jane).contains(JANE.lastName());assertThat(jane).contains("" + JANE.age());assertThat(jane).doesNotContain(JOHN.firstName());}}關于Immutables庫,還有很多要說的,因此這里有一本相當大的手冊 。 在本文中,我們僅對表面進行了一些刮擦。 例如,有關使用Immitables和樣式自定義 (方法前綴,構建器名稱等)以及甚至為Mongo生成存儲庫以便將文檔視為不可變對象的 JSON序列化的更多細節。 但是,這比我在這篇簡單文章中所涉及的要多得多。
要解決的問題是,尚未普及的Java語言的挑戰之一就是冗長和樣板代碼。 但是有很多工具可以處理它,并且可以選擇最合適的庫,而不是通過復制粘貼或嘗試編寫自己的代碼生成器進行編碼。
好好利用它們。
好好用
翻譯自: https://www.javacodegeeks.com/2018/03/lombok-autovalue-and-immutables-or-how-to-write-less-and-better-code-returns.html
lombok和maven
總結
以上是生活随笔為你收集整理的lombok和maven_Lombok,AutoValue和Immutables,或如何编写更少,更好的代码返回的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jwt令牌_jwt-cli:用于解码JS
- 下一篇: 如何申请免费域名(如何免费注册域名)