java - 与 java 中的私有(private)/ protected 方法相关的性能与设计

标签 java private protected

<分区>

我们正与一位 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{        
}
}

最佳答案

Do you think the below mentionned test is robust enough for making the comparison?

坦率地说,没有。

微基准测试很棘手; here是关于他们的一个很好的讨论。就个人而言,我总是添加预热时间(例如,我运行一个方法的前 x 次不计入性能,让各种单例有机会初始化并让 JIT 编译器有时间发挥它的魔力),并且我确保运行带有 -server 开关的 JVM。此外,我怀疑编译器可能足够聪明,可以删除 a++ 操作,因为它们的结果不会去任何地方。

但无论您的基准测试是否正确,我强烈相信私有(private)方法与 protected 方法是一个设计问题,就这样。两者之间可能存在的性能差异对方法是私有(private)还是 protected 决定没有任何影响

关于java - 与 java 中的私有(private)/ protected 方法相关的性能与设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9191927/

相关文章:

scala - Scala其他实例的 protected 成员

java - Netbeans 和 shell 窗口之间的不同行为

java - Hibernate & EhCache : net. sf.ehcache.Statistics 未填充?

java - 为什么重写在 JAVA 中的工作方式与 C++ 有所不同?

javascript - JS 私有(private)方法没有在每次构造函数调用时重新定义

java - 为什么在Java中访问 protected 成员是这样实现的?

java - Netbeans - Java 应用程序可以对 'Stop' 使用react吗?

swift - 为什么访问控制有用?

c++ - 空类的默认构造函数是公共(public)的。但是怎么办?

java - 来自其他包的 protected 方法调用