【问题标题】:How to set fields in an abstract class?如何在抽象类中设置字段?
【发布时间】:2016-03-11 10:06:48
【问题描述】:

我有一个包含字段的抽象类,它应该具有以下属性:

  • 公共接口只读
  • 只写子类

我现在的问题是:我应该如何设置和初始化这个字段?

public abstract class A {
    // initialize it here ?
    private int field = 0;

    // initialize it in constructor ?
    protected A(int field)
    {
        this.field = field;
    }
      
    // use protected setter ?
    protected void setField(int val){
        this.field = val;
    }

    // or use protected field
    protected int field;

    public int getField(){
        return field;
    }
}

如何初始化/访问该字段?

public class B extends A {
    
    public B(int val){
        super(val);
        // or
        setField(val);
        // or
        field = val;
    }
}

使用受保护的构造函数是个好主意吗?

【问题讨论】:

  • 为什么需要静态变量?
  • @KevinEsche 我认为他的意思是静态数据,而不是静态变量
  • @jam 因为标题这么写?

标签: java abstract access-modifiers


【解决方案1】:

这基本上是你的需要

如果你想在创建子对象时初始化超类字段,那么你可以调用super(val);

如果您想创建独立于父对象的字段值的子对象。对子类使用默认构造函数,如果需要在子对象上设置父值调用 setField(val); 方法。

使用 smth. 是个好主意吗?像受保护的构造函数?

是的,如果你真的想限制对包中类的访问

【讨论】:

  • 抽象类的受保护构造函数,我认为这可能是设计缺陷
  • 那么使用受保护的字段而不是 setter 呢?
  • @jam 即使是子类直接公开你的字段也不是一个好主意,通过 Setter 和 Getter 提供访问总是安全的。所以 IMO 受保护的字段不是一个好主意。
  • 好的,所以使用 setter。此外,我对使用抽象类的构造函数感到困惑,因为它们不允许被实例化
  • @jam 不要对此感到困惑。如果您想在创建对象时自行初始化静态数据,最好使用构造函数。您可以构造函数来避免这种情况,而不是将值设置为字段数。考虑您正在开发 API(付费)的用例,需要使用您的 api 的开发人员必须提供 api 密钥。如果他们使用 setter,开发人员可能会忘记设置 api。在这种情况下,最好强制他们通过构造函数本身提供 api 密钥。
猜你喜欢
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 2016-10-22
相关资源
最近更新 更多