<分区>
我们正与一位 friend 就 Java 代码设计和效率进行讨论。
他认为,出于性能原因以及覆盖时的类一致性保护,方法最好是私有(private)的。
我认为方法最好受到保护以实现完全的可定制性,并避免在用户想要更改其部分行为时浪费时间修改和发布 API。
我们知道对 composition over inheritance 的偏好所以这里我主要关注性能比较。
一个简单的测试(见下文)证明父级具有 protected 方法的扩展类并不比父级具有私有(private)方法的扩展类慢。它甚至有时(我不太了解性能变化)更快。
elapsed:8051733.063 microseconds for A (private)
elapsed:8036953.805 microseconds for B (protected)
您认为下面提到的测试是否足以进行比较?
public class VerifPerfProtected {
public static void main(String[] args) {
int ncalls = 1000000000; //10^9
ChildrenClassA a = new ChildrenClassA();
ChildrenClassB b = new ChildrenClassB();
long start = System.nanoTime();
a.manyCalls(ncalls);
long stop = System.nanoTime();
System.out.println("elapsed:" + (stop - start)/1000.0 + " microseconds for A (private)");
start = System.nanoTime();
b.manyCalls(ncalls);
stop = System.nanoTime();
System.out.println("elapsed:" + (stop - start)/1000.0 + " microseconds for B (protected)");
}
public static class ParentClassA{
public void manyCalls(int n){
for (int i = 0; i < n; i++) {
callAmethod();
}
}
public void callAmethod(){
aPrivateMethod();
}
private void aPrivateMethod(){
int a=0;
for (int i = 0; i < 5; i++) {
a++;
}
}
}
public static class ParentClassB{
public void manyCalls(int n){
for (int i = 0; i < n; i++) {
callAmethod();
}
}
public void callAmethod(){
aProtectedMethod();
}
protected void aProtectedMethod(){
int a=0;
for (int i = 0; i < 5; i++) {
a++;
}
}
}
public static class ChildrenClassA extends ParentClassA{
}
public static class ChildrenClassB extends ParentClassB{
}
}