Есть ли выигрыш в производительности для локальных переменных по сравнению с переменными класса / экземпляра в Java (Android)? - PullRequest
0 голосов
/ 30 марта 2019

Я часто определяю переменные как переменные класса / экземпляра («глобальные» перед редактированием, спасибо за разъяснения) в моем классе во время программирования на Android.В случае, если мне нужно получить к нему доступ позже, скажем, другим методом после того, как он был назначен в onCreate().

В тех случаях, когда я на самом деле не получаю к ним доступ позже, проверка кода Lint в Android Studio выдает предупреждение о том, что «Поле может быть преобразовано в локальную переменную».

Я знаю, что я получу ту же функциональность в любом случае, но есть ли какая-то польза от производительности или безопасности для встроенных / локальных переменных метода в Java (особенно в Android, но в целом) по сравнению с объявлением их как частного класса/ переменные экземпляра в классе?

РЕДАКТИРОВАНИЕ / УТОЧНЕНИЕ: Под «глобальным» я подразумевал область видимости класса.(То, что я знаю, понимается как относящиеся к переменным «класса» или «экземпляра», мой плохой) Доступно всем методам в классе, а не встроенной или специфичной для метода переменной.Возможно, своего рода пример кода проиллюстрирует мою точку зрения.Пример:

public class MyActivity {

//Android Studio Lint will throw Java Class structure 'Field can be local' warnings 
//which is why I'm referring to these variables as "global" 
    private SomeDataType myPrivateVariable1; //'Field can be converted to a local variable'
    public SomeDataType myPublicVariable1; //'Field can be converted to a local variable'
    private SomeDataType myPrivateVariable2; 
    public SomeDataType myPublicVariable2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity_layout);

        //assign data to variables from either intent bundle or preferences or w/e
        myPrivateVariable1 = SOME_DATA;  
        myPublicVariable1 = SOME_DATA;
        //AS will suggest change to:
        // SomeDataType myPrivateVariable1 = SOME_DATA;
        // SomeDataType myPublicVariable1 = SOME_DATA;

        myPrivateVariable2 = SOME_DATA;
        myPublicVariable2 = SOME_DATA;

        //AS Lint will throw warning that variables can be converted b/c only used here
        someMethod(myPrivateVariable1);
        someOtherMethod(myPublicVariable1); 

        //run a method that uses the variables
        myMethodUsingVariable2(input);
    }

    private void myMethodUsingVariable2(DataType input) {
        //access the variables in multiple methods will not trigger the warning
        if (input == something) {
            //do something with 'myPrivateVariable2' and 'myPublicVariable2'
        }
    }

}

В чем преимущество производительности?Если позже я обнаружу, что мне нужно использовать myPrivateVariable1 или myPublicVariable1 в другом методе при добавлении функции или изменении чего-либо, было бы проще написать новые методы, которые использовали бы данные, если они уже были сохранены в определенной переменной класса.и присвоил значение из метода onCreate().Является ли единственным преимуществом выделение памяти, которое существенно повлияет на производительность, только если переменные представляют собой большие наборы данных?В чем же разница между публичным и частным в этом отношении?

1 Ответ

1 голос
/ 30 марта 2019

Я часто определяю переменные как глобальные (приватные) в моем классе, когда программирую на Android.В случае, если мне нужно получить к нему доступ позже, скажем, в другом методе после того, как он был назначен в onCreate ().

То, что вы имели в виду, является термином для переменной Class Scope.

Я знаю, что в любом случае я получу ту же функциональность, но есть ли какая-либо выгода в плане производительности или безопасности для встроенных / локальных переменных метода в Java (особенно в Android, но также в целом) по сравнению с объявлением их в качестве частных глобальных переменных в классе?

Основным преимуществом использования переменной области действия метода является ремонтопригодность .Рассмотрим следующий класс с переменной класса class:

public class SampleClass {
  // a class scope variable
  private int mHeight;

  private int getSquareValueOfHeight() {
    return mHeight * mHeight;
  }

  private void increaseHeightByOne() {
    mHeight = mHeight + 1;
  }
}

у нас есть два метода;getSquareValueOfHeight(), который читает значение mHeight и возвращает его квадратное значение, и increaseHeightByOne(), который изменил значение mHeight.

Вы можете видеть, что вам нужно проверять mHeight всякий раз, когдавам нужно изменить оба метода.Как насчет того, есть ли 3 или 5 или более методов доступа к mHeight?Вы должны перепроверить все методы, чтобы убедиться, что изменение не нарушает весь ваш код.

Теперь рассмотрим следующий класс:

public class SampleClass {

  private int height;

  private int getSquareValueOfHeight(int value) {
    int height = value * value;
    return;
  }

  private int increaseHeightByOne(int height) {
    return height + 1;
  }

}

У нас есть два метода, которые используютзначение из его параметра.getSquareValueOfHeight() вернет возведенное в квадрат значение без изменения переменной height области видимости класса, поскольку у него есть собственная переменная height (это механизм затенения).Когда вы вызываете следующий код:

 SampleClass sampleClass = new SampleClass();
 int value = sampleClass.getSquareValueOfHeight(5);

переменная области видимости класса height не изменится.Поэтому вам не нужно беспокоиться о том, что изменение нарушит весь ваш код.

...