lombok和maven_Lombok,AutoValue和Immutables,或如何编写更少,更好的代码返回
lombok和maven
在上一篇有關(guān)Lombok庫的文章中 ,我描述了一個庫,該庫有助于處理Java中的樣板代碼( 是的,我知道這些問題已經(jīng)在Kotlin中解決了 ,但這是現(xiàn)實生活,我們不能一味地坐下來,一旦出現(xiàn)較新或更簡單的語言,請重寫每個現(xiàn)有項目。 但是生活中有很多事情, Lombok項目有其替代方案。 讓我們也給他們一個機(jī)會。
本文的代碼示例可在此處和此處找到。
它實際上是Lombok的替代方案-因為您不能一次使用兩者。 或者,至少事實證明,在同一個項目中同時使用IntelliJ IDEA和IntelliJ IDEA時,您將遇到很多困難,因為這是許多人真正選擇的IDE,因為這兩個庫處理批注處理的方式不同。 因此,兩個人都無法生存,而另一個人則得以幸存,這大約是哈利·波特和伏地魔的預(yù)言所表達(dá)的方式 。
因此,我們已經(jīng)知道使用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; }如果我們創(chuàng)建一個新項目并按此處所述使用autovalue ,則可以使用AutoValue Builders模仿幾乎相同的模型 。
現(xiàn)在讓我們看一下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生成帶有單個注釋的構(gòu)建器時, AutoValue將使您創(chuàng)建自己的構(gòu)建器代碼-盡管不是全部。 基本上,您定義接口后,實現(xiàn)將由AutoValue生成的代碼完成,您不必實際實現(xiàn)getter和setter中的代碼。 即使我們同意AutoValue getter接口不會比Lombok字段定義花費(fèi)更多的時間或空間,但是對于某些人來說,編寫AutoValue構(gòu)建器代碼仍然是一件麻煩事。
但是,它可以提供更大的靈活性 ,因為您實際上可以更改構(gòu)建器方法名稱。 此外, 代碼分析和使用情況搜索是一個巨大的勝利–這樣,您實際上可以分別查找實際的getter和setter的用法,這對開發(fā)人員也可能很重要。
實例的創(chuàng)建方法與Lombok相同。
final Person anna = Person.builder().age(31).firstName("Anna").lastName("Smith").build();我們所有的測試都在代碼更改最少的情況下運(yùn)行,主要是因為AutoValue無法將實例轉(zhuǎn)換為構(gòu)建器(或者至少我不容易找到它),因此復(fù)制只是調(diào)用靜態(tài)工廠方法:
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());}}其他顯而易見的區(qū)別:
- 您編寫的AutoValue類始終是抽象的。 它們在AutoValue生成的代碼中實現(xiàn)。
- AutoValue類是自動不可變的。 有一種解決方法,使它們具有不可變類型的屬性 。 即使您明確希望在實例上具有setter, 也不能 。
為什么要使用AutoValue ? AutoValue的創(chuàng)建者會謹(jǐn)慎地在此處描述該庫的收益,甚至就此創(chuàng)建一個完整的演示文稿 。
該庫還使用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(); }因此,具有抽象類的相同原理僅在生成的代碼中實現(xiàn)。 為此,您需要啟用IDE注釋處理器 ,就像對Lombok一樣 (但對于AutoValue則不需要,因為它是由gradle插件完成的)。
那么,對象創(chuàng)建的外觀如何?
final Person anna = ImmutablePerson.builder().age(31).firstName("Anna").lastName("Smith").build(); System.out.println(anna);乍一看,最明顯的區(qū)別是:
- 我們不聲明構(gòu)建器方法。
- 靜態(tài)的builder / factory方法不是在我們自己的類上創(chuàng)建的,而是在生成的類上創(chuàng)建的。
- 與AutoValue一樣,無法在類上生成生成器,只能在生成器上生成。
- 生成的類也自動 -ers,就是實例方法,允許通過改變一個屬性來創(chuàng)建實例的副本補(bǔ)充說:
- 該構(gòu)建器具有自動添加的from()方法,該方法允許創(chuàng)建實例的精確副本,并且在生成的類上還有一個生成的靜態(tài)copyOf()方法:
同樣,我們的測試運(yùn)行時所做的更改很小,主要是關(guān)于如何復(fù)制實例的:
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());}}關(guān)于Immutables庫,還有很多要說的,因此這里有一本相當(dāng)大的手冊 。 在本文中,我們僅對表面進(jìn)行了一些刮擦。 例如,有關(guān)使用Immitables和樣式自定義 (方法前綴,構(gòu)建器名稱等)以及甚至為Mongo生成存儲庫以便將文檔視為不可變對象的 JSON序列化的更多細(xì)節(jié)。 但是,這比我在這篇簡單文章中所涉及的要多得多。
要解決的問題是,尚未普及的Java語言的挑戰(zhàn)之一就是冗長和樣板代碼。 但是有很多工具可以處理它,并且可以選擇最合適的庫,而不是通過復(fù)制粘貼或嘗試編寫自己的代碼生成器進(jìn)行編碼。
好好利用它們。
好好用
翻譯自: https://www.javacodegeeks.com/2018/03/lombok-autovalue-and-immutables-or-how-to-write-less-and-better-code-returns.html
lombok和maven
總結(jié)
以上是生活随笔為你收集整理的lombok和maven_Lombok,AutoValue和Immutables,或如何编写更少,更好的代码返回的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jwt令牌_jwt-cli:用于解码JS
- 下一篇: vertx rest 跨域_Vertx编