Вызовы статических методов для производных типов над виртуальными реализациями?(Android) - PullRequest
2 голосов
/ 08 июля 2010

У меня есть класс 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 все не финальное / не приватное считается виртуальным, верно?)

Согласно разделу Проектирование для производительности в Документах для разработчиков Android, я должен поменять эти виртуальныеметоды для статических.Таким образом, вышеприведенное становится:

   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 ]

2 голосов
/ 08 июля 2010

Нет смысла делать обертки для методов в базовом классе, потому что они все равно будут присутствовать в производном классе.

Что касается подсказки по производительности с сайта Android - то, что они имели в виду, это сделать методстатический, если вы обнаружите, что его тело не ссылается на какое-либо нестатическое поле или метод.Это избавит от накладных расходов на внутреннюю передачу указателя this.

В любом случае, если вам нужно настроить приложение на производительность на таком мелком уровне, вы должны иметь доказательство (путем профилирования), что именно этот методвызывает замедление.Оптимизация случайных частей кода, даже если он основан на догадках, - пустая трата времени.

0 голосов
/ 08 июля 2010

Это лучший вариант для вас

   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 ().

Не беспокойтесь об оптимизации сейчас, фокуспри хорошем программировании ОО, если это медленно, вернитесь и оптимизируйте проблемные области, когда вы закончите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...