静态方法通过虚拟实现调用派生类型? (机器人)

时间:2010-07-08 17:21:24

标签: java android performance static virtual

我有A类,方法是foo和bar,由A1和A2实现。 A1和A2的功能相同。换句话说:

   public class A {
       public int foo() { return 0; };
       public int bar() { return 1; };
   }

    class A1 extends A {      
        public int AnotherFooFunction() { return foo(); }
        public int AnotherBarFunction() { return bar(); }
    }

    class A2 extends A { 
        public int AnotherFooFunction() { return foo(); }
        public int AnotherBarFunction() { return bar(); }
    }

以这种方式保持代码或将这些虚拟方法换成静态方法更好吗? (在Java中,所有非final / non-private都被认为是虚拟的,对吗?)

根据Android Developer Docs中的Designing for Performance部分,我应该将这些虚拟方法替换为静态方法。所以上面变成了:

   public class A {
        public int foo() { return 0; };
        public int bar() { return 1; };
   }

    class A1 extends A {      
        public int AnotherFooFunction() { return A.foo(); }
        public int AnotherBarFunction() { return A.bar(); }
    }

    class A2 extends A { 
        public int AnotherFooFunction() { return A.foo(); }
        public int AnotherBarFunction() { return A.bar(); }
    }

这是“它应该”的样子吗?我完全意识到我可能在文档中误解了这一段。

2 个答案:

答案 0 :(得分:2)

为基类中的方法创建包装器没有意义,因为无论如何它们都将出现在派生类中。

关于来自Android网站的性能提示 - 如果您发现它的主体没有引用任何非静态字段或方法,那么它们的意思是使方法保持静态。这将消除内部传递this指针的开销。

无论如何,为了在这种细粒度级别上调整应用程序的性能,你必须有一个证明(通过分析)这个方法正好导致速度减慢。优化代码的随机部分,即使它是基于猜测,也是浪费时间。

答案 1 :(得分:0)

这是您的最佳选择

   public abstract class A {
       public int foo() { return 0; };
       public int bar() { return 1; };
   }

    class A1 extends A {      

    }

    class A2 extends A { 

    }

A1和A2自动继承foo()和bar()方法。

现在不要担心优化,专注于良好的面向对象编程,如果速度慢,请在完成后优化问题区域。