2010-07-08 3 views
2

나는 A1과 A2에 의해 구현되는 foo와 bar 메소드를 가진 클래스 A를 가지고있다. 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의 경우 비 최종/비공개는 모두 가상으로 간주됩니다.)

Android 개발자 문서의 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

답변

2

기본 클래스의 메서드에 대한 래퍼를 만들 때 아무 의미가 없습니다. 어쨌든 파생 클래스에 있기 때문입니다.

안드로이드 웹 사이트의 성능 팁과 관련하여, 본문이 비 정적 필드 나 메소드를 참조하지 않는다는 것을 알았다면, 그 의미는 메소드를 정적으로 만드는 것입니다. 이렇게하면 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는() 및 자동 줄() 메서드를 상속합니다.

지금 당장은 최적화에 대해 걱정할 필요가 없습니다. 좋은 OO 프로그래밍에 집중하십시오. 속도가 느려지면 문제 영역을 최적화 할 수 있습니다.

관련 문제