在Java中,当您希望通过Collection
方法从一般的remove()
方法中正确地删除对象时,您必须实现equals(Object o)
和remove()
方法,这两个方法可以在remove()
中自动生成。该方法的示例如下所示-->下面。
List.Remove()
方法正常工作?Equals
方法应该是什么样的呢?我是说它应该是什么样的。Equals()
方法甚至在List.Remove()
中使用吗?如果是的话,请告诉我,如果比较相同的对象(内存中相同的地址),Equals()
应该如何实现才能返回true? @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((centerPanel == null) ? 0 : centerPanel.hashCode());
result = prime * result + ((lowerPanel == null) ? 0 : lowerPanel.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if(this == obj)
return true;
if(obj == null)
return false;
if(getClass() != obj.getClass())
return false;
LayoutDemo other = (LayoutDemo) obj;
if(centerPanel == null) {
if(other.centerPanel != null)
return false;
} else if(!centerPanel.equals(other.centerPanel))
return false;
if(lowerPanel == null) {
if(other.lowerPanel != null)
return false;
} else if(!lowerPanel.equals(other.lowerPanel))
return false;
return true;
}
发布于 2015-07-21 07:24:01
设计时自动生成Equals()
如果您想要生成它一次,然后手动维护生成的源代码(例如,如果类发生了变化),Resharper是一个有用的工具,@ThomasWeller在他的回答中已经提到了这一点。
请注意,这种方法可能很难找到bug,因为您需要记住在更改类时要调整Equals()
实现。要避免这种情况,请使用以下方法:
运行时自动生成Equals()
(静态初始化时间)
如果您想要在运行时动态生成Equals()
和GetHashCode()
方法的解决方案,可以使用Equ (我是该库的作者)。Equ在静态初始化时生成相等的方法并对它们进行缓存,因此在静态初始化之后,性能与显式实现相同。
下面是一个简单的例子:
class Address : MemberwiseEquatable<Address>
{
public Address(string street, string city)
{
Street = street;
City = city;
}
public string Street { get; }
public string City { get; }
}
这样,下面的表达式是true
new Address("Baker Street", "London") == new Address("Baker Street", "London")
这是使用Equ的最简单方法:从MemberwiseEquatable<TSelf>
继承即可。注意,如果不能/不想从基类继承,还有其他可能性。
按值比较与参考比较的注记
在最后一个问题中,您想知道如何编写一个通过“内存中的地址”比较对象的Equals
方法。这称为引用相等比较,是每个类从object
继承的默认object
实现。因此,要获得类上的引用相等,只需不要重写Equals()
。
但是,您应该仔细考虑要通过引用比较哪些对象,以及要按值比较哪些对象。如果使用领域驱动的设计术语,则应按值对值对象进行比较,而实体则应通过引用或ID进行比较。
发布于 2014-01-08 12:38:42
不是的。ReSharper可以做到这一点(以及实现IEquatable<T>
之类的其他优点),但普通VS无法做到。
发布于 2016-02-04 20:10:47
我知道这不是一个完整的自动生成,但在Visual 2015中,有一种方法至少可以自动生成Hashcode()和Equals()函数的方法存根。
我希望这对某人有帮助!
https://stackoverflow.com/questions/20995811
复制相似问题