autovalue_AutoValue:生成的不可变值类
autovalue
Google GitHub托管的項目AutoValue之所以有趣,有多種原因。 該項目不僅使為“ 值對象 ”編寫更少的Java代碼變得容易,而且還為Java注釋處理的實際應用提供了概念上簡單的演示。 該自動/值項目是由提供谷歌的員工凱文Bourrillion和埃蒙·麥克馬納斯和許可與Apache的版本2的許可 。
《 AutoValue用戶指南》簡短明了,其簡潔和簡潔反映了項目本身。 用戶指南提供了使用AutoValue的簡單示例,討論了為什么需要 AutoValue,在“ 我如何……”部分中對常見問題進行了簡短回答,并概述了與使用AutoValue有關的一些最佳做法 。
下面的代碼清單包含一個我手寫的簡單類,稱為Person 。 編寫此類時要牢記AutoValue。
人.java
package dustin.examples.autovalue;import com.google.auto.value.AutoValue;/*** Represents an individual as part of demonstration of* GitHub-hosted project google/auto/value* (see https://github.com/google/auto/tree/master/value).*/ @AutoValue // concrete extension will be generated by AutoValue abstract class Person {/*** Create instance of Person.** @param lastName Last name of person.* @param firstName First name of person.* @param birthYear Birth year of person.* @return Instance of Person.*/static Person create(String lastName, String firstName, long birthYear){return new AutoValue_Person(lastName, firstName, birthYear);}/*** Provide Person's last name.** @return Last name of person.*/abstract String lastName();/*** Provide Person's first name.** @return First name of person.*/abstract String firstName();/*** Provide Person's birth year.** @return Person's birth year.*/abstract long birthYear(); }當使用AutoValue生成完整的“值類”時,只需為AutoValue提供一個抽象類(故意不支持接口)以生成相應的具體擴展。 該abstract類必須使用@AutoValue批注進行注釋,必須提供提供值類實例的static方法,并且必須提供暗示值類的受支持字段的public或包范圍的abstract訪問器方法。
在上面的代碼清單中,靜態實例創建方法實例化了AutoValue_Person對象,但是我沒有定義這樣的AutoValue_Person類。 此類是AutoValue生成的類的名稱,該類將在對Person.java進行javac編譯時執行AutoValue的注釋處理時生成。 由此,我們可以看到AutoValue生成的類的命名約定: AutoValue_放在源類的名稱之前,以形成生成的類的名稱。
當Person.java在編譯過程中應用AutoValue注釋處理進行編譯時,將生成生成的類。 就我而言(使用AutoValue 1.2 / auto-value-1.2.jar ),生成了以下代碼:
AutoValue_Person.java:由AutoValue生成
package dustin.examples.autovalue;import javax.annotation.Generated;@Generated("com.google.auto.value.processor.AutoValueProcessor")final class AutoValue_Person extends Person {private final String lastName;private final String firstName;private final long birthYear;AutoValue_Person(String lastName,String firstName,long birthYear) {if (lastName == null) {throw new NullPointerException("Null lastName");}this.lastName = lastName;if (firstName == null) {throw new NullPointerException("Null firstName");}this.firstName = firstName;this.birthYear = birthYear;}@OverrideString lastName() {return lastName;}@OverrideString firstName() {return firstName;}@Overridelong birthYear() {return birthYear;}@Overridepublic String toString() {return "Person{"+ "lastName=" + lastName + ", "+ "firstName=" + firstName + ", "+ "birthYear=" + birthYear+ "}";}@Overridepublic boolean equals(Object o) {if (o == this) {return true;}if (o instanceof Person) {Person that = (Person) o;return (this.lastName.equals(that.lastName()))&& (this.firstName.equals(that.firstName()))&& (this.birthYear == that.birthYear());}return false;}@Overridepublic int hashCode() {int h = 1;h *= 1000003;h ^= this.lastName.hashCode();h *= 1000003;h ^= this.firstName.hashCode();h *= 1000003;h ^= (this.birthYear >>> 32) ^ this.birthYear;return h;}}通過檢查生成的代碼可以得出以下幾點結論:
- 生成的類擴展了(實現繼承)手寫的抽象類,從而允許使用代碼使用手寫類的API,而不必知道正在使用生成的類。
- 即使沒有在源類中直接定義任何字段,也將生成字段; AutoValue解釋了提供的abstract訪問器方法中的字段。
- 生成的類不為字段提供“設置” / mutator方法(get / accessor方法)。 這是AutoValue的故意設計決策 ,因為Value Objects的一個關鍵概念是它們是不可變的。
- 考慮到每個字段的類型,將自動為每個字段適當地生成equals(Object) , hashCode()和toString()的實現。
- 在源類和方法上的Javadoc注釋不會在生成的擴展類上重現。
使用諸如AutoValue生成之類的方法的主要優點之一是,開發人員可以專注于特定類應支持的更簡單的高級概念,并且代碼生成可確保一致,正確地實現較低級的細節。 但是,使用這種方法時要記住一些事情,文檔的“ 最佳實踐”部分是一個不錯的地方,可以很早閱讀,以了解AutoValue的假設是否適合您的情況。
- 當開發人員受過足夠的訓練以檢查和維護abstract “源” Java類而不是生成的類時,AutoValue很有可能會有所幫助。
- 下次注釋處理再次生成該類時,對生成類的更改將被覆蓋,否則必須停止該類的生成,以免發生這種情況。
- 您將需要設置build / IDE,以便將生成的類視為“源代碼”,從而可以編譯abstract類。
- 如果將可變字段與AutoValue一起使用時,如果要保持不變性,則必須格外小心(通常選擇使用Value Objects時就是這種情況)。
- 查看“ 最佳做法”和“我如何……”部分,以確保沒有任何AutoValue的設計假設使它不利于您的需求。
結論
AutoValue允許開發人員編寫更簡潔的代碼,重點放在高級細節上,并將繁瑣的底層(通常是容易出錯的)細節的實現委派給AutoValue來自動生成代碼。 這類似于IDE的源代碼生成可以執行的操作,但是AutoValue優于IDE方法的優點是,AutoValue可以在每次編譯代碼時重新生成源代碼,從而使生成的代碼保持最新。 AutoValue的這一優勢也是Java自定義注釋處理功能的一個很好的例子。
翻譯自: https://www.javacodegeeks.com/2016/06/autovalue-generated-immutable-value-classes.html
autovalue
總結
以上是生活随笔為你收集整理的autovalue_AutoValue:生成的不可变值类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java8 guava_Guavate:
- 下一篇: (linux导出mysql)