2013-10-24 52 views
2

作为其一个痛苦的处理在两个地方之类的结构变化我经常这样做:使用中间阵列的hashCode和equals

class A { 
    class C{} 
    class B{} 
    private B bChild; 
    private C cChild; 

    private Object[] structure() { 
    return new Object[]{bChild, cChild}; 
    } 

    public int hashCode() { 
     Arrays.hashCode(structure()); 
    } 

    public boolean equals(Object that) { 
    //type check here 
    return Arrays.equals(this.structure(), ((A)that).structure()); 
    } 
} 

有什么不好,除了原语的拳击这种做法? 可以改进吗?

+0

除了事实,即它不能编译,你是什么意思?到目前为止,它没有任何建议。 – EJP

+0

这种方法试图解决什么问题? – Vitaliy

+0

@Vitaliy,将对象结构封装在两个地方而不是三个(fields,equals,hashCode)。 – Basilevs

回答

-2

有人熟悉代码会看到发生了什么更难。这比列出单个字段要“不明显”,正如我以前错误的答案所证明的那样。确实,“平等”通常是通过传入的“对象”来实现的,所以它是有争议的,但是输入是在引用相等检查后进行的。这里情况不同。

一个改进可能是将数组存储为私有数据成员,而不是使用结构方法创建它,牺牲一点内存以避免装箱。

+0

这是Java,而不是C++ – Basilevs

+0

我不做C++。当我说比较内存位置的平等时,我的意思是你比较对象是否是内存中的同一个实例......占用相同的空间,因为它是同样的事情。 – sdanzig

+0

-1你在这里试图制定的东西似乎是关于参考平等。不,在我的课堂上从不检查参考平等。 – Basilevs

0

这是一个聪明的方式来重用库方法,这通常是一个好主意;但是它会执行大量的额外分配和数组操作,在这些常用的方法中这可能非常低效。总而言之,我会说它很可爱,但它不会通过审查。

+0

我们可以以某种方式解决这些问题吗?通过重用数组实例,例如? – Basilevs

+0

这会增加每个对象的内存使用量。更糟! –

+0

http://stackoverflow.com/a/27609/125562 - 高度投票的答案也使用助手对象。 – Basilevs

0

在JDK 7中,他们添加了java.util.Objects类。它实际上实现了一个哈希和等于效用的方式,提醒你写了什么。关键是这种方法实际上受到了JDK开发人员的认可。 Ernest Friedman-Hill有一点,但在大多数情况下,我不认为额外的几个机器指令值得以可读性为代价值得保存。

例如:哈希实用方法是这样实现的:

public static int hash(Object... values) { 
    return Arrays.hashCode(values); 
} 
相关问题