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

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

最佳答案

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

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

  • OO纯粹主义者将建议您避免使用static,因为它破坏了OO范式。
  • 当然,使用final关键字也可以防止子类覆盖方法。在这方面,结果与static相同。
  • final应该更经常使用,并且与protected一起使用是一个好主意。请参阅“有效Java”中的第17项。
  • protectedstatic很少一起使用。您可能将OO构造与破坏正常OO行为的构造混合在一起,因此这种组合很奇怪。
  • 07-24 04:35