Java 在子类中设置超类字段
我有一个抽象Java类,它有一个hashcode字段,应该由具体的子类初始化。我在考虑将初始化方法抽象化,即Java 在子类中设置超类字段,java,design-patterns,Java,Design Patterns,我有一个抽象Java类,它有一个hashcode字段,应该由具体的子类初始化。我在考虑将初始化方法抽象化,即 abstract class A { protected int hashcode; // hashcode should be initialized in constructor protected A () { hashcode = setHashcode(); } abstract int setHashcode() {} // implemented by su
abstract class A {
protected int hashcode;
// hashcode should be initialized in constructor
protected A () { hashcode = setHashcode(); }
abstract int setHashcode() {} // implemented by subclasses
}
但不幸的是,不同的子类需要为setHashcode
接受不同数量的参数,例如,类B可能使用它的两个字段来计算hashcode,类C可能需要三个字段,但由于对super的调用必须是B的构造函数中的第一行,因此该方案不起作用。所以我想知道是否有不同的方法/设计模式来解决这个问题
但是,由于对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));
}
}
您实际上不需要将值存储在超类中,只需声明子类将覆盖的抽象
getHashCode
public abstract class Base {
protected abstract int getHashCode();
}
这会更好,因为不管存储需求如何,方法的“意图”都会得到保留
顺便提一下,
hashCode
已经在对象中定义,并且可以被子类覆盖。如果您对哈希代码的概念与对象提供的不同,也许您应该对其进行重命名。听起来接口可能适合初始化,因此您创建的任何子类都可以重载接口实现。更改:
abstract int setHashcode();
致:
子类需要检查传递的对象的数量和类型
然后你会打这样的电话:
hashcode = getHashcode();
hashcode = getHashcode(o1);
hashcode = getHashcode(o1,o2);
作为对style的一个说明:使用名为setSomething()
的方法是很尴尬的,它不设置任何值,而是返回计算值calculateHashcode
或determinatehashcode
可以更好地表达方法的意图。您可能会在中找到有用的信息。
hashcode = getHashcode();
hashcode = getHashcode(o1);
hashcode = getHashcode(o1,o2);