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

dmz*_*rsk 9 java inheritance final protected

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

jto*_*ron 21

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

下面就来想想混合的一种方式final,protectedstatic关键字:

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

  • 现在读它. (2认同)
  • 我同意,但纯粹主义者曾试图说服我恰恰相反:"数学"方法不应该是静态的! (2认同)