Как создать статическую локальную переменную в Java? - PullRequest
51 голосов
/ 17 января 2010

Я читал, что Java не поддерживает static локальные переменные в отличие от C / C ++. Теперь, если я хочу закодировать функцию с локальной переменной, значение которой должно сохраняться между вызовами функции, как мне это сделать?
Должен ли я прибегнуть к использованию переменных экземпляра?

Ответы [ 7 ]

33 голосов
/ 17 января 2010

Вы можете иметь статическую переменную класса, которая будет сохраняться во всех экземплярах класса. Если это то, что вы хотите. Если нет, используйте переменную экземпляра, которая будет сохраняться только при вызовах методов для этого объекта.

public class Foo {
   static int bar;
   //set bar somewhere

   public int baz() {
      return 3 * bar;
   }
} 
6 голосов
/ 17 января 2010

Если вы хотите повторно использовать значение переменной между вызовами функций и изолировать эту переменную от других методов, вы должны заключить ее в объект. Во-первых, определите класс только с «статическими» переменными и нужной вам функцией:

class MyFunctionWithState {
    private int myVar = 0;
    public int call() {
      myVar++;
      return myVar;
    }
 }

Тогда из вашего клиентского кода:

class Foo {
    private MyFunctionWithState func = new MyFunctionWithState();
    public int bar() {
      return func.call();
    }
 }

Теперь, если func зависит от внутреннего состояния Foo, вы можете либо передать соответствующие данные через call(), либо передать экземпляр Foo и позволить функции вызывать соответствующие методы получения:

class MyFunctionWithState {
    private int myVar = 0;
    public int call( Foo f ) {
      myVar += f.getBaz();
      return myVar;
    }
 }

class Foo {
    private MyFunctionWithState func = new MyFunctionWithState();
    public int bar() {
      return func.call( this );
    }
    public int getBaz() {  /*...*/  }
 }
5 голосов
/ 20 августа 2013

Локальные переменные - это переменные внутри метода. Только метод получает доступ к этим переменным. у вас не может быть статической локальной переменной, но вы можете использовать переменные экземпляра или переменные класса.

Если у вас есть статический метод, который по умолчанию создает копию этого метода для всех объектов и не может быть разбит в дальнейшем, так как локальные переменные ограничивают их доступ только для метода, в котором они находятся.

4 голосов
/ 17 января 2010

Должен ли я прибегнуть к использованию инстанса переменные?

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

0 голосов
/ 18 января 2016

Либо вы отметили правильный ответ, который не был, либо вы на самом деле хотели статические переменные класса - но правильный ответ - это, в основном, Левит, или технически смесь всех ответов.

Для людей из C-фона, подобных мне, действительно желающих статические локальные переменные функции исключительно для преимущества в области видимости над глобальными, кажется, что ответом на Java является то, что вы не можете. Не без чего-то подобного @paradigmatic будет работать с экземпляром класса со статическим глобалом и getter (), уникальным для экземпляра класса, в котором вы выполняете свою функцию.

Если, как я подозреваю, вы работаете с классом как синглтон, или полностью статически, как изначально процедурный программист, с которого мы все начинали, ответ @Ellie P или @ user2626445 будет работать нормально, так как ни один другой экземпляр не будет ввернут до вашего глобального. Но для достижения того, что, я думаю, вам нужно, на самом деле это должна быть просто переменная экземпляра, которая является глобальной в C. Они сохраняются в вызовах функций, но позволяют использовать вашу функцию OO-способом, поэтому несколько экземпляров могут сохранять свои собственные постоянные переменные для этой конкретной функции.

Лично я обхожу это в jave таким же образом, как я обхожу Hi-Tech C, не разрешая переменные битов функции, объявляя глобальный в файле чуть выше объявления функции. Таким образом, я, когда я взломаю код позже, с меньшей вероятностью будет думать, что он глобальный, и у него будет соблазн возиться с ним - не поэтому ли мы инкапсулируем вещи?

0 голосов
/ 19 декабря 2014

В следующем примере count ведет себя как статическая локальная переменная, которую вы можете использовать в C:

public class Foo {

   private int count = 0;

   public int getCount() {
       return count++;               
   }
} 

Нет статических локальных переменных, которые поддерживаются другими языками. Так как java очень "ориентирован на класс", он пытается привести его к этому контексту. Если вы хотите смоделировать это поведение, вы используете переменную экземпляра, которая используется только этим методом. Так что это статично для разных вызовов метода , а не для самого класса.

0 голосов
/ 10 июля 2014

final int intVar = 1; // Будет инициирован только один раз. Ведет себя как статическая локальная переменная C ++ в методе.

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