2

我有一个抽象的 Java 类,它有一个哈希码字段,应该由具体的子类初始化。我正在考虑使初始化方法抽象,即

abstract class A {
  protected int hashcode;
  // hashcode should be initialized in constructor
  protected A () { hashcode = setHashcode(); }
  abstract int setHashcode() {} // implemented by subclasses
}

但不幸的是,不同的子类需要为setHashcode.不会工作。所以我想知道是否有不同的方式/设计模式来解决这个问题?

4

4 回答 4

2

您实际上不需要将值存储在超类中,只需声明一个getHashCode子类将覆盖的抽象。

public abstract class Base {
  protected abstract int getHashCode();
}

这更好,因为无论其存储要求如何,都保留了方法的“意图”。

顺便说一句,hashCode已经在 中定义Object,并且可以被子类覆盖。如果您的哈希码概念与Object提供的不同,也许您应该重命名它。

于 2012-04-10T03:32:38.097 回答
2

但是由于对 super 的调用必须是 B 的构造函数中的第一行,所以这个方案不起作用

为什么它不起作用?如果将哈希码的计算放在子类的静态函数中,则可以将预制的哈希码传递给超类的构造函数。

class BaseClass {
    private int hashCode;
    protected BaseClass(int hashCode) {this.hashCode = hashCode;}
}
class DerivedClass : BaseClass {
    private static int calcHash(String str) {
        return str.hashCode();
    }
    public DerivedClass(String s) {
        super(calcHash(str));
    }
}
于 2012-04-10T03:29:03.687 回答
1

听起来接口可能适合初始化,因此您创建的任何子类都可以重载接口实现。

于 2012-04-10T03:32:59.407 回答
0

改变:

abstract int setHashcode(); 

至:

abstract int getHashcode(Object...objects); 

并且子类需要检查传递的对象的数量和类型。

然后您拨打以下电话:

  hashcode = getHashcode(); 
  hashcode = getHashcode(o1); 
  hashcode = getHashcode(o1,o2); 
于 2012-04-10T03:44:19.987 回答