Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅在子类中使用的超类受保护字段是否为不良做法?_Java - Fatal编程技术网

Java 仅在子类中使用的超类受保护字段是否为不良做法?

Java 仅在子类中使用的超类受保护字段是否为不良做法?,java,Java,我有一个这样的超类,我希望有很多类可以继承: public abstract class Super { protected Object myField; //Not used anywhere in this class //a load more code here which does useful stuff } 所有这些类都需要使用myField的实例。但是,超类没有。我是否在某个地方做出了错误的设计决策?不一定。如果所有子类出于相同的原因需要相同的字段,那么这与在

我有一个这样的超类,我希望有很多类可以继承:

public abstract class Super {
    protected Object myField; //Not used anywhere in this class
    //a load more code here which does useful stuff
}

所有这些类都需要使用
myField
的实例。但是,超类没有。我是否在某个地方做出了错误的设计决策?

不一定。如果所有子类出于相同的原因需要相同的字段,那么这与在基类中提供任何其他公共功能没有什么不同。随着类的增长,您可能会发现添加了使用此字段的公共功能(例如,在equals/hashCode方法中引用它)


现在,如果字段是对象类型,每个子类都会把一些完全不同的东西放入其中,我会考虑代码的气味。

< P>不,我不这么认为。抽象类就是为了达到这个目的(在基类中有公共功能,让子类只实现特定的必需功能)。

用这样一个模糊的描述很难说,但看起来您可以做一些泛化,并将一些公共代码推到您的超类中。如果您的子类与字段做了类似的事情,那么可以找到一些共性(使用模板方法或策略来处理子类特定的差异),否则,如果每个子类都用它做了不同的事情,那么使用公共字段有什么意义?

如中所述

受保护的字段或方法可供类本身、其子类和同一包中的类访问


这意味着受保护的字段被精确地设计为具有这些特征。

好吧,如果某个类没有真正使用某个字段,那么该字段不应该出现在该类中。在我看来,你真正想要的是有一个基类,它告诉它的子类“你们都应该有一些方法来保持X的状态,但我(基类)不会修改X的状态,在这种情况下,你应该创建一个抽象方法来传达这个信息,类似这样:

public abstract class Super {
    protected abstract Object getMyField();
}

那么,如果你不在class
Super
中使用这个字段,为什么你需要它呢

也许您的超类将提供一个接口,以通用方式与该字段交互,例如:

public abstract class Super<T> {
    protected T myField; 

    public T getField() {
        return myField;
    }
}

public class Child extends Super<String> {
    public Child( String label ) {
        super.myField = label;
    }
}
公共抽象类Super{
受保护的T myField;
公共T getField(){
返回myField;
}
}
公营儿童班{
公共子对象(字符串标签){
super.myField=标签;
}
}

简单一点
你的hirachy中唯一的共同点是一个字段,那么你应该摆脱抽象类,创建一个标记接口。

为什么所有的子类都需要它,但它根本不在基类中使用?从根本上说,受保护的字段是一个糟糕的选择。为什么?@RBT我个人很少使用受保护的成员我自己,也就是说,他们有自己的位置。