Получите прямой доступ к статическим полям вместо вызова статического метода получения, это быстрее? - PullRequest
4 голосов
/ 16 февраля 2012

Я пишу приложение для Android, и у меня есть класс, который генерирует и поддерживает некоторые фиксированные URL-адреса, которые могут иногда меняться.Я держу их всех в одном классе под названием UrlUtils:

public class UrlUtils {
  private static String sUrlBase = "http://google.com";

  /**
   * Called occasionally
   */
  public static void refreshUrlBases() {
        sUrlBase = "http://yahoo.com/" + new Random().nextInt();
  }

   public static String getUrlBase() {
        return sUrlBase;
   }
}

Мне нужно сделать много звонков на getUrlBase() и выше, поэтому я подумывал сделать общедоступным sUrlBase и получить к нему прямой доступ.Будет ли этот подход лучше с точки зрения производительности?

Ответы [ 4 ]

5 голосов
/ 16 февраля 2012

Да, из соображений производительности следует избегать использования геттеров и сеттеров. Вот совет от Android " Проектирование для производительности " док.

Без JIT прямой доступ к полю примерно в 3 раза быстрее, чем вызов тривиальный добытчик. С JIT (где прямой доступ к полю так же дешево, как прямой локальный доступ примерно в 7 раз быстрее, чем вызывая тривиальный добытчик. Это верно в Froyo, но улучшится в будущее, когда JIT встроенные методы получения.

2 голосов
/ 16 февраля 2012

Если вы не собираетесь менять свой URL чаще, тогда вместо getter/setter метода я скажу, что вы можете оставить static напрямую

public static String google_url = "http://google.com";
public static String yahoo_url  = "http://yahoo.com";

При сохранении static метода, этоможет случиться так, что из-за какой-то проблемы static setter значения будут removed (сброс к исходному).Таким образом, в этом случае он вернет вам original константу static значения.

ОБНОВЛЕНИЕ:

Если вы собираетесь обновить URLdynamically тогда static method окажется лучшим вариантом.

    public static String sUrlBase = "http://google.com"; 

    public static String getsUrlBase() {
        return sUrlBase;
    }
    public static void setsUrlBase(String sUrlBase) {
        this.sUrlBase = sUrlBase;
    }
0 голосов
/ 16 февраля 2012

Обычно я бы не слишком беспокоился о производительности для небольших простых данных, таких как URL, как в данном случае, и поэтому в данном случае, будь то прямой доступ к полю или доступ с использованием методов, меня не сильно беспокоит.Случай, когда это будет иметь значение для меня, - это когда частота вызовов геттера настолько высока, что это влияет на общий отклик.Моя забота будет касаться случайного изменения значения [bugs :(], так как поле имеет открытый статический доступ. При доступе через getter / setter, по крайней мере, есть одно место, где я могу сделать некоторые проверки.

0 голосов
/ 16 февраля 2012

Это не имеет значения. Вы должны использовать любой метод, который вам удобнее. Обычно вы должны использовать методы получения и установки для удобочитаемости и практики кода.

...