首页 > 解决方案 > 在多个构造函数中扩展一个类并处理一个最终变量

问题描述

我正在尝试扩展一个类以在实现上有细微的变化。现在这个父类中有一个最终变量:

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;

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

标签: javainheritance

解决方案


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

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 */);
   }

   ...
}

推荐阅读