2010-07-08 87 views
2

我有類A,方法foo和bar,由A1和A2實現。 A1和A2的功能都是一樣的。換句話說:靜態方法通過虛擬實現調用派生類型? (Android)

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中,所有非最終/非私有都被認爲是虛擬的,對嗎?)

根據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(); } 
    } 

這是它應該如何「應該」?我完全意識到我可能會誤解文檔中的這一段。

+1

在上一個代碼示例中,是否將'class A'中的方法聲明爲'public static int'? – mob 2010-07-08 17:51:20

回答

2

在基類中爲方法打包是沒有意義的,因爲無論如何它們都會出現在派生類中。

關於Android網站的性能提示 - 他們的意思是讓方法成爲靜態的,如果你發現它的主體不指向任何非靜態的字段或方法。這將消除在內部傳遞this指針的開銷。

無論如何,爲了調整你的應用程序在如此細緻的級別上的性能,你必須有一個證明(通過分析)確切地說這種方法導致了一個減速。優化代碼的隨機部分,即使是基於猜測,也是浪費時間。

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()方法自動。

現在不要擔心優化問題,關注良好的面向對象編程,如果它很慢回來並在完成後優化問題區域。

相關問題