使用超类“protected final”方法来保留子类的公共代码

时间:2011-10-04 17:26:36

标签: java inheritance final protected

作为一名(迂腐的)初学Java程序员,我想知道,将所有子类使用的公共代码块移动到单独的受保护 final < / strong>)父类中的方法?填充具有常用值的列表或常用过滤算法等任务...... 是否也可以使用受保护的静态方法?

class A {
    protected final List<String> getVariants() {...}
    protected final List<String> filterResults(List<String> variants) {...}
}

class B extends A {
    public List<String> doSomethingUsefull() {
        List<String> commonVariants = getVariants();
        ...
        return filterResults(commonVariants);
    }
}

class C extends A {
    public void doSomethingUsefull() {
        List<String> commonVariants = getVariants();
        ...
        return filterResults(commonVariants);
    }

    public void doMoreUsefullThings() {
        List<String> commonVariants = getVariants();
        ...
        return filterResults(commonVariants);
    }
}

4 个答案:

答案 0 :(得分:21)

如果您是Java初学者,并且正在考虑这些事情,那么现在是阅读“有效Java”一书中第4章“类和接口”的好时机。那里的信息将比你在这里获得的答案更加彻底和细致。

以下是考虑混合finalprotectedstatic关键字的一种方法:

  • OO纯粹主义者会建议你避免static因为它打破了OO范式。
  • 当然,使用final关键字也可以防止子类覆盖方法。在这方面,结果与static相同。
  • final应该更频繁地使用,并且与protected一起使用它是个好主意。参见“Effective Java”中的第17项。
  • protectedstatic不经常一起使用。你将OO构造与一个破坏正常OO行为的构造混合,因此组合是奇数。

答案 1 :(得分:4)

这对我来说似乎很合理 - 尽管你也可能想要A抽象。另外,请考虑使用合成 - 可BC 包含 A而不是继承它吗?

答案 2 :(得分:2)

首先,你不应该使用extend来达到这个目的,因为过多的扩展总是坏主意。

其次,你完全没有重复你的代码,但是通过重复部分代码对它进行分组并不是一个好的选择。优选的方法是通过抽象层次将事物分组在现实世界中。

最后但并非最不重要的,如果您有疑问:分别与否,延伸或组合,受保护的最终或仅受保护,请尝试将单元测试写入此课程,答案将非常快。

答案 3 :(得分:0)

如果它们不依赖于某些类字段,我建议将所有这些方法移动到单独的静态类中。使它们成为util方法。