2012-05-14 51 views
0

我得到了一个基类型和一些派生类型。每个派生类型都有一个将由util类中的静态final字段初始化的字段,并且基类型将使用该字段。 e.g如何在继承层次结构中设计字段?

public BaseClass{ 
    protected String FLAG = ""; 

    public void someMethod(){ 
     // codes using FLAG 
    } 
} 

public DerivedClass1 implements BaseClass{ 
    protected String FLAG = Util.FLAG1; 
} 

public DerivedClass2 implements BaseClass{ 
    protected String FLAG = Util.FLAG2; 
} 

我的问题是

  1. 是设计好的?
  2. 我应该为FLAG制作受保护的getter/setter,并在派生类中使用setter来初始化它吗?
  3. 如果其他类别调用FLAG,例如if (baseClass.FLAG.equals(...)),我应该为它公开getter/setter吗?我不这么认为,因为FLAG只是一个标志,它有点像静态字段。
+0

你试过了吗? (没关系 - 由于你的命名,它认为这是一个静态的领域。我希望你可以从移动安卓网站删除评论。) –

回答

0

1-不,设计不好。你不应该重新定义标志在子类中,但只有在超值赋给国旗:

public DerivedClass1 implements BaseClass{ 
    public DerivedClass1() { 
     this.flag = Util.FLAG1; 
    } 
} 

领域不应该被命名为喜欢的一个常数,因为它不是一个。 flag而不是FLAG

2-不一定。但是,您可以将其作为基类构造函数的参数,以强制每个子类在构造时提供值。

3-从不直接访问其他类的字段。绝对使用吸气剂从外面访问它。不,标志不是静态字段,因为每个实例都有它自己的值。

+0

谢谢。但是第三个问题,实际上DerivedClass1的每个实例都有一些标志(它们的值是相等的)。 –

+1

它们的值是相等的,但这不会使该字段保持静态。您仍然需要一个DerivedClass1实例来访问标志值。 –

1

您的设计不正常,因为子类字段隐藏了基类字段。如果你只是想以不同的方式分配在每个子类,基类的领域,这样做在各自的构造 - 或者更好,委托给基类构造函数:

public BaseClass { 
    protected final String FLAG; 
    protected BaseClass(String flag) { this.FLAG = flag; } 
    ... 
} 

public DerivedClass1 extends BaseClass { 
    public DerivedClass1() { super(Util.FLAG1); } 
    ... 
} 

public DerivedClass2 extends BaseClass { 
    public DerivedClass2() { super(Util.FLAG2); } 
    ... 
} 

还注意到,这是对强大的Java约定来命名UPPER_CASE中的实例字段。所以你应该有一个protected String flag

至于另外两个问题 - 如果您将设计更改为上述内容,那么flag字段为final,您可以将其设置为public,并让其他人直接访问它。这将是合法的设计,据我所知,但你可能会从其他许多Java开发人员这样做皱眉:)

你提到添加一个设置器标志,但我怀疑这会使任何意义(只是猜测,你可能真的想稍后改变那个标志)。

+0

+1我同意,很好的答案。这里的要点是你可以覆盖方法(称为多态),但不能使用属性。 – Brady

+0

谢谢。那么如果其他类调用它,我必须使用'baseClass.getFlag()',对吧?顺便说一句,我知道关于命名约定的东西,但我只是认为标志有点像语义学的静态字段。 –

+0

这是一种错误的语义引导你的想法 - 当Java开发者看到一个“FLAG”时,他直观地认为它是一个“静态最终”字段 - 在你的情况下,这将是错误的。更高级的业务语义并不是推动var命名的原因。 –

0

我不喜欢这种设计,因为你有一个只有数据不同的类,但是至少在行为上不是这样。

从只提供静态工厂方法来创建实例创建坏 MyClass实例
public MyClass { 
    protected final String FLAG; 

    public static MyClass CreateClass1() { return new MyClass(Util.FLAG1); } 

    public static MyClass CreateClass2() { return new MyClass(Util.FLAG1); } 

    protected MyClass(String flag) { this.FLAG = flag; } 
} 

在这种情况下,你保护的用户:我想如下构建它。你也避免了创建一个到目前为止似乎不需要的类层次结构。