作为一名(迂腐的)初学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);
}
}
答案 0 :(得分:21)
如果您是Java初学者,并且正在考虑这些事情,那么现在是阅读“有效Java”一书中第4章“类和接口”的好时机。那里的信息将比你在这里获得的答案更加彻底和细致。
以下是考虑混合final
,protected
和static
关键字的一种方法:
static
因为它打破了OO范式。final
关键字也可以防止子类覆盖方法。在这方面,结果与static
相同。final
应该更频繁地使用,并且与protected
一起使用它是个好主意。参见“Effective Java”中的第17项。protected
和static
不经常一起使用。你将OO构造与一个破坏正常OO行为的构造混合,因此组合是奇数。答案 1 :(得分:4)
这对我来说似乎很合理 - 尽管你也可能想要A
抽象。另外,请考虑使用合成 - 可B
和C
包含 A
而不是继承它吗?
答案 2 :(得分:2)
首先,你不应该使用extend来达到这个目的,因为过多的扩展总是坏主意。
其次,你完全没有重复你的代码,但是通过重复部分代码对它进行分组并不是一个好的选择。优选的方法是通过抽象层次将事物分组在现实世界中。
最后但并非最不重要的,如果您有疑问:分别与否,延伸或组合,受保护的最终或仅受保护,请尝试将单元测试写入此课程,答案将非常快。
答案 3 :(得分:0)
如果它们不依赖于某些类字段,我建议将所有这些方法移动到单独的静态类中。使它们成为util方法。