在三个Java IDE中生成的三种常见方法
在本文中,我研究了NetBeans 8.0.2 , IntelliJ IDEA 14.0.2和Eclipse Luna 4.4.1生成的三種“通用”方法[ equals(Object) , hashCode()和toString() ]的區別 。 。 目的不是確定哪種方法最好,而是要說明可以用于實現這些通用方法的不同方法。 在此過程中,可以基于IDE的假設收集一些有趣的見解,以創建這些通用方法,并提示開發人員進行設置。
NetBeans 8.0.2
NetBeans 8.0.2允許將項目屬性配置為支持JDK 8平臺,并期望JDK 8源格式,如以下兩個屏幕快照所示。
在NetBeans 8.0.2中,通過單擊“源” |“生成”來生成代碼。 插入代碼(或擊鍵Alt + Insert)。
當生成方法equals(Object) , hashCode()和toString() ,NetBeans 8.0.2要求在每個生成的方法中使用屬性,如以下兩個屏幕快照所示。
NetBeans生成的方法利用了JDK 7引入的 Objects類。
NetBeans802NetratedCommonMethods.java類的NetBeans生成的hashCode()方法
@Override public int hashCode() {int hash = 5;hash = 29 * hash + Objects.hashCode(this.someString);hash = 29 * hash + Objects.hashCode(this.timeUnit);hash = 29 * hash + this.integer;hash = 29 * hash + Objects.hashCode(this.longValue);return hash; }NetBeans802NetratedCommonMethods.java類的NetBeans生成的equals(Object)方法
@Override public boolean equals(Object obj) {if (obj == null){return false;}if (getClass() != obj.getClass()){return false;}final NetBeans802GeneratedCommonMethods other = (NetBeans802GeneratedCommonMethods) obj;if (!Objects.equals(this.someString, other.someString)){return false;}if (this.timeUnit != other.timeUnit){return false;}if (this.integer != other.integer){return false;}if (!Objects.equals(this.longValue, other.longValue)){return false;}return true; }NetBeans802NetratedCommonMethods.java類的NetBeans生成的toString()方法
@Override public String toString() {return "NetBeans802GeneratedCommonMethods{" + "someString=" + someString + ", timeUnit=" + timeUnit + ", integer=" + integer + ", longValue=" + longValue + '}'; }關于NetBeans生成的通用方法,可以觀察到以下幾點:
- 所有生成的代碼都是自動的,除操作員選擇的方法中使用的字段外,不支持自定義。
- 所有這些擴展Object類中對應項的通用方法都會自動提供@Override注釋。
- 沒有Javadoc文檔包含生成的方法。
- 這些方法利用Objects類使生成的代碼更簡潔,而對null檢查的需求更少。
- toString()生成的String僅支持一種格式,并且該輸出格式為單個逗號分隔的行。
- 我沒有在上面的示例中顯示它,但是在某些情況下,NetBeans 8.0.2的方法生成確實將數組與引用,枚舉和基元區別對待:
- 生成的toString()方法像對待其他實例屬性一樣對待實例的數組屬性:它依賴于數組的toString() ,這通常導致不希望的且通常無用的結果(數組的系統標識哈希碼 )。
IntelliJ IDEA 14.0.2
對于這些示例,我正在使用IntelliJ IDEA 14.0.2 Community Edition 。
IntelliJ IDEA 14.0.2提供了配置項目結構以期望JDK 8的“語言級別”的能力。
要在IntelliJ IDEA 14.0.2中生成代碼,可以使用Code | 生成選項(或擊鍵Alt + Insert(如NetBeans))。
IntelliJ IDEA 14.0.2提示操作員應在生成的方法中包括哪些屬性。 它還詢問哪些字段非空,這意味著假定哪些字段永遠不會為空。 在此處顯示的快照中,將對它們進行檢查,這將導致方法在嘗試訪問它們之前不檢查這些屬性是否為null。 但是,在我用IntelliJ IDEA為本章生成的代碼中,我不會選中它們,這意味著IntelliJ IDEA將在生成的方法中訪問它們之前先檢查是否為null。
IntelliJ IDEA 14.0.2的toString()生成為生成的toString()方法提供了冗長的格式(模板)列表。
IntelliJ IDEA 14.0.2還允許操作員選擇要包含在生成的toString()方法中的屬性(突出顯示的背景為藍色時選擇)。
類Idea1402GeneratedCommonMethods.java的IDEA生成的equals(Object)方法
public boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Idea1402GeneratedCommonMethods that = (Idea1402GeneratedCommonMethods) o;if (integer != that.integer) return false;if (longValue != null ? !longValue.equals(that.longValue) : that.longValue != null) return false;if (someString != null ? !someString.equals(that.someString) : that.someString != null) return false;if (timeUnit != that.timeUnit) return false;return true; }類Idea1402GeneratedCommonMethods.java的IDEA生成的hashCode()方法
@Override public int hashCode() {int result = someString != null ? someString.hashCode() : 0;result = 31 * result + (timeUnit != null ? timeUnit.hashCode() : 0);result = 31 * result + integer;result = 31 * result + (longValue != null ? longValue.hashCode() : 0);return result; }類Idea1402GeneratedCommonMethods.java的IDEA生成的toString()方法
@Override public String toString() {return "Idea1402GeneratedCommonMethods{" +"someString='" + someString + '\'' +", timeUnit=" + timeUnit +", integer=" + integer +", longValue=" + longValue +'}'; }可以觀察到有關IntelliJ IDEA生成的常見方法:
- 大多數生成的代碼是自動的,并且具有少量可用的自定義功能,包括操作員選擇的方法中使用的字段,期望哪些字段為非空的規范(以便在生成的代碼中不需要空檢查)以及選擇的能力八種內置toString()格式之一。
- 所有這些擴展Object類中對應項的通用方法都會自動提供@Override注釋。
- 沒有Javadoc文檔包含生成的方法。
- 生成的方法不使用Objects類,因此需要對所有可能為null的引用進行顯式檢查是否為null。
- 上面的示例中未顯示,但是IntelliJ IDEA 14.0.2在生成這三種常見方法時確實以不同的方式對待數組:
- 生成的toString()方法在數組上使用Arrays.toString(Array) 。
Eclipse Luna 4.4.1
Eclipse Luna 4.4.1允許將“項目屬性”中的Java編譯器設置為JDK 8。
在Eclipse Luna中,開發人員使用“源”下拉列表選擇要執行的特定類型的源代碼生成。
Eclipse Luna允許操作員選擇要包含在常用方法中的屬性。 它還允許操作員指定所生成方法的一些特征。 例如,操作員可以選擇在生成的toString()方法中單獨打印數組的元素,而不是使用通常無意義的類名和系統標識哈希碼。
類Eclipse441GeneratedCommonMethods.java的Eclipse生成的hashCode()方法
/* (non-Javadoc)* @see java.lang.Object#hashCode()*/ @Override public int hashCode() {final int prime = 31;int result = 1;result = prime * result + this.integer;result = prime * result+ ((this.longValue == null) ? 0 : this.longValue.hashCode());result = prime * result+ ((this.someString == null) ? 0 : this.someString.hashCode());result = prime * result+ ((this.timeUnit == null) ? 0 : this.timeUnit.hashCode()); return result; }類Eclipse441GeneratedCommonMethods.java的Eclipse生成的equals(Object)方法
/* (non-Javadoc)* @see java.lang.Object#equals(java.lang.Object)*/ @Override public boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Eclipse441GeneratedCommonMethods other = (Eclipse441GeneratedCommonMethods) obj;if (this.integer != other.integer)return false;if (this.longValue == null){if (other.longValue != null)return false;} else if (!this.longValue.equals(other.longValue))return false;if (this.someString == null){if (other.someString != null)return false;} else if (!this.someString.equals(other.someString))return false;if (this.timeUnit != other.timeUnit)return false;return true; }類Eclipse441GeneratedCommonMethods.java的Eclipse生成的toString()方法
/* (non-Javadoc)* @see java.lang.Object#toString()*/ @Override public String toString() {return "Eclipse441GeneratedCommonMethods [someString=" + this.someString+ ", timeUnit=" + this.timeUnit + ", integer=" + this.integer+ ", longValue=" + this.longValue + "]"; }關于Eclipse生成的通用方法,可以觀察到以下幾點:
- Eclipse在生成過程中提供了最多的點,可以在其中配置所生成的輸出。 以下是一些可配置的選項:
- 可以明確指定類中的位置(在類的現有方法之前或之后)。
- 所有這些擴展Object類中對應項的通用方法都會自動提供@Override注釋。
- 生成的方法不使用Objects類,因此需要對所有可能為null的引用進行顯式檢查是否為null。
- 當生成本文中突出顯示的三種常用方法時,Eclipse Luna 4.4.1確實會以不同的方式對待數組:
- 生成的toString()可以選擇使用Arrays.toString(Object[])或重載版本來訪問數組的內容。
結論
這篇文章中介紹的所有三個IDE(NetBeans,IntelliJ IDEA和Eclipse)均生成常見方法equals(Object) , hashCode()和toString()合理實現,但是這些生成的方法在可定制性之間存在差異。三個IDE。 可用的不同定制和生成的不同實現可以為Java新手提供經驗教訓,以供他們學習和考慮實現這些方法。 雖然這些IDE生成這些方法的能力最明顯和最顯著的優點是與這種自動生成相關的時間節省,但是這些方法的IDE生成的其他優點包括能夠學習實現這些方法的能力以及成功實現的可能性更大。沒有錯別字或其他錯誤。
翻譯自: https://www.javacodegeeks.com/2014/12/three-common-methods-generated-in-three-java-ides.html
總結
以上是生活随笔為你收集整理的在三个Java IDE中生成的三种常见方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 8 Streams API作为
- 下一篇: Java / JVM是如何构建的? 采用