在本文中,我研究了NetBeans 8.0.2 , IntelliJ IDEA 14.0.2和Eclipse Luna 4.4.1生成的三种“通用”方法[ equals(Object) , hashCode()和toString() ]的区别 。 。 目的不是确定哪种方法最好,而是要说明可以用于实现这些通用方法的不同方法。 在此过程中,可以基于IDE的假设收集一些有趣的见解,以创建这些通用方法,并提示开发人员进行设置。
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类。
@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;
}
@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;
}
@Override
public String toString()
{
return "NetBeans802GeneratedCommonMethods{" + "someString=" + someString + ", timeUnit=" + timeUnit + ", integer=" + integer + ", longValue=" + longValue + '}';
}
关于NetBeans生成的通用方法,可以观察到以下几点:
所有生成的代码都是自动的,除操作员选择的方法中使用的字段外,不支持自定义。
所有这些扩展Object类中对应项的通用方法都会自动提供@Override注释。
没有Javadoc文档包含生成的方法。
这些方法利用Objects类使生成的代码更简洁,而对null检查的需求更少。
toString()生成的String仅支持一种格式,并且该输出格式为单个逗号分隔的行。
- 生成的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。
- 生成的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生成的通用方法,可以观察到以下几点:
- 可以明确指定类中的位置(在类的现有方法之前或之后)。
- 所有这些扩展Object类中对应项的通用方法都会自动提供@Override注释。
- 生成的方法不使用Objects类,因此需要对所有可能为null的引用进行显式检查是否为null。
- 生成的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