Mar*_*tin 2 java private protected
我们正和朋友讨论java代码设计和效率问题.
他认为,出于性能原因,方法最好是私有的,以及在覆盖时最好保持类一致性.
我认为最好保护方法以获得完全的可定制性,并且一旦用户想要改变其部分行为,就应避免浪费时间修改和释放API.
我们知道组合优于继承,所以在这里我主要关注性能比较.
一个简单的测试(见下文)证明父类具有受保护方法的扩展类并不比具有私有方法的父类慢.甚至有时 (我真的不太了解性能变化)更快.
elapsed:8051733.063 microseconds for A (private)
elapsed:8036953.805 microseconds for B (protected)
Run Code Online (Sandbox Code Playgroud)
你认为下面提到的测试足够强大,可以进行比较吗?
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{
}
}
Run Code Online (Sandbox Code Playgroud)