Java 要求子类设置父类';s数据成员

Java 要求子类设置父类';s数据成员,java,Java,这似乎是一项普通的任务,但我有点困惑。假设我有一个抽象父类,它有一个数据成员和相应的getter/setter public abstract class Parent { private MyObj myObj; public MyObj getMyObj() { return myObj; } public void setMyObj(MyObj myObj) { this.myObj = myObj; } } 我需要强制子类设置“myObj”变量。我有两个选择

这似乎是一项普通的任务,但我有点困惑。假设我有一个抽象父类,它有一个数据成员和相应的getter/setter

public abstract class Parent {

    private MyObj myObj;

    public MyObj getMyObj() { return myObj; }
    public void setMyObj(MyObj myObj) { this.myObj = myObj; }
}
我需要强制子类设置“myObj”变量。我有两个选择:

  • 使setter“抽象”(而不是getter)。这对我来说似乎很奇怪 我,我以前没见过
  • 避免在中声明数据成员 根本不是父母。只要有一个父方法

    抽象公共MyObj getMyObj()

  • 然后每次创建新对象时,父对象将始终引用为getMyObj().getField1()、getMyObj().getField2()等,而不是将其存储在单个位置


    强制子类设置父类的数据变量的标准方法是什么?这是一个新的抽象方法,在getter/setter之外吗?

    您可以从子对象调用setter方法。

    您可以从子对象调用setter方法。

    要让编译器强制设置
    myObj
    ,您可以执行以下操作:

    public abstract class Parent {
    
        private final MyObj myObj;
    
    final
    表示该值不能更改,但必须进行设置。由于您有一个setter,该值可能会被更新;如果需要,不要添加
    final
    关键字

    要确保字段已设置,请添加构造函数:

        protected Parent( MyObj initial ) {
            if ( initial == null )
                throw new IllegalArgumentException( "Must provide a value!" );
            this.myObj = initial;
        }
    

    要让编译器强制设置
    myObj
    ,可以执行以下操作:

    public abstract class Parent {
    
        private final MyObj myObj;
    
    final
    表示该值不能更改,但必须进行设置。由于您有一个setter,该值可能会被更新;如果需要,不要添加
    final
    关键字

    要确保字段已设置,请添加构造函数:

        protected Parent( MyObj initial ) {
            if ( initial == null )
                throw new IllegalArgumentException( "Must provide a value!" );
            this.myObj = initial;
        }
    

    你为什么要这么做?为什么不重用相同的数据成员getter和setter?@Mureinik:原因是,尽管您可以从子类调用setMyObj(),但不需要这样做。但是子级必须设置它。如果该值是必需的,则在构造函数中需要它。为什么还要这样做?为什么不重用相同的数据成员getter和setter?@Mureinik:原因是,尽管您可以从子类调用setMyObj(),但不需要这样做。但是子级必须设置它。如果该值是必需的,则在构造函数中需要它。我可以调用setter方法,但我不需要这样做。但是必须要求子级在父级中设置它。我可以调用setter方法,但不要求我这样做。但必须要求子级在父级中设置它。