扩展一个类并在多个构造函数中处理最终变量

时间:2019-02-10 15:36:49

标签: java inheritance

我正在尝试扩展一个类,以在实现上略有不同。现在,该父类中有一个最终变量为:

private final float mIndicatorItemLength = DP * 4;

是在类级别定义的,我想从子类为该变量提供自定义值。由于此变量是最终变量,因此我将其更改为从构造函数初始化。我在这里有两个构造函数:

public HorizontalCirclePagerIndicatorDecoration()

引用为:

public HorizontalCirclePagerIndicatorDecoration() {
    mIndicatorItemLength = DP * 4;
}

public HorizontalCirclePagerIndicatorDecoration(int colorActive, int colorInactive, int mIndicatorItemLength)

第一个构造函数是默认的,第二个构造函数是我想从子类访问的,并使用子类的super关键字设置自定义值,例如:

public TPagerIndicator(int colorActive, int colorInactive) {
    super(colorActive, colorInactive, mIndicatorItemLength);
}

我的孩子班级签名如下:

TPagerIndicator extends HorizontalCirclePagerIndicatorDecoration

但是我在这里遇到错误,因为:在超类型构造函数被调用之前无法引用TPagerIndicator.mIndicatorItemLength

现在我想我必须删除

上的最终修饰符
private final float mIndicatorItemLength = DP * 4;

在父类中。这是正确的方法吗?

1 个答案:

答案 0 :(得分:1)

这是正确的方法。如您所知,子类必须至少调用一个超类构造函数。在Java中,不允许使用尚未初始化的最终属性(mIndicatorItemLength)。

class HorizontalCirclePagerIndicatorDecoration {
   ...
   private final float mIndicatorItemLength;

   HorizontalCirclePagerIndicatorDecoration() {
      mIndicatorItemLength = DP * 4;
   }

   HorizontalCirclePagerIndicatorDecoration(
         final int colorActive, 
         final int colorInactive, 
         final int mIndicatorItemLength) {
      ...
      this.mIndicatorItemLength = mIndicatorItemLength;
   }

   ...
} 

class TPagerIndicator extends HorizontalCirclePagerIndicatorDecoration {
   TPagerIndicator(
         final int colorActive,
         final int colorInactive) {
      super(colorActive, colorInactive, 12.3F /* Explicit set */);
   }

   TPagerIndicator(
         final int colorActive,
         final int colorInactive
         final int mIndicatorItemLength) {
      super(colorActive, colorInactive, mIndicatorItemLength /* Input set */);
   }

   ...
}
相关问题