Как сделать область видимости переменной глобальной (не делая ее фактически глобальной)

#java #function #global #string

#java #функция #глобальная #строка

Вопрос:

Как я могу сделать область видимости строковой переменной (в Java) глобальной.Чтобы к ней можно было получить доступ из другой функции, например

 //String b="null"; I don't want to do this... because if i do this, fun2 will print Null

    public int func1(String s)
    {

    String b=s;

    }

    public int func2(String q)
    {

    System.out.println(b);//b should be accessed here and should print value of s

    }
  

Любая помощь… Спасибо

Ответ №1:

Одной из фундаментальных концепций в ООП является концепция области видимости: почти во всех случаях целесообразно уменьшить область видимости переменной (т. Е. Там, Откуда она видна) до ее минимального допустимого диапазона.

Я предполагаю, что вам абсолютно необходимо использовать эту переменную в обеих функциях. Следовательно, минимальная жизнеспособная область в этом случае будет охватывать обе функции.

 public class YourClass
{
   private String yourStringVar;

   public int pleaseGiveYourFunctionProperNames(String s){
      this.yourStringVar = s;
   }
   public void thisFunctionPrintsValueOfMyStringVar(){
      System.out.println(yourStringVar);
   }
}
  

В зависимости от ситуации вы должны оценить требуемую область видимости переменной, и вы должны понимать последствия увеличения области видимости (больше доступа = потенциально больше зависимостей = сложнее отслеживать).

В качестве примера, допустим, вам абсолютно необходимо, чтобы это была ГЛОБАЛЬНАЯ переменная (как вы называете ее в своем вопросе). Доступ к переменной с глобальной областью видимости может быть получен любым пользователем в приложении. Это исключительно опасно, что я и продемонстрирую.

Чтобы создать переменную с глобальной областью видимости (в Java точно нет таких вещей, как глобальные переменные), вы создаете класс со статической переменной.

 public class GlobalVariablesExample
{
   public static string GlobalVariable;
}
  

Если бы я изменил исходный код, теперь он выглядел бы так.

 public class YourClass
{
   public int pleaseGiveYourFunctionProperNames(String s){
      GlobalVariablesExample.GlobalVariable = s;
   }
   public void thisFunctionPrintsValueOfMyStringVar(){
      System.out.println(GlobalVariablesExample.GlobalVariable);
   }
}
  

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

 public class YourApplication{
    public static void main(String args[]){
        YourClass instance1 = new YourClass();
        YourClass instance2 = new YourClass();

        instance1.pleaseGiveYourFunctionProperNames("Hello");
        instance1.thisFunctionPrintsValueOfMyStringVar(); // This prints "Hello"

        instance2.pleaseGiveYourFunctionProperNames("World");
        instance2.thisFunctionPrintsValueOfMyStringVar(); // This prints "World"
        instance1.thisFunctionPrintsValueOfMyStringVar(); // This prints "World, NOT Hello, as you'd expect"
    }
}
  

Всегда оценивайте минимально допустимую область видимости для ваших переменных. Не делайте ее более доступной, чем она должна быть.

Кроме того, пожалуйста, не называйте свои переменные a, b, c. И не называйте свои переменные func1,func2. Это не замедлит работу вашего приложения и не убьет вас, если вы введете несколько дополнительных букв.

Ответ №2:

Хм. Вам явно нужны некоторые уроки объектно-ориентированного программирования. В OO нет «глобальной» переменной. Но любая переменная, определенная как член в классе (вне метода), является глобальной в этом классе.

 public class MyClass {

    private String myVar; // this can be accessed everywhere in MyClass

    public void func1(String s) {
        myVar = s;
    }

    public void func2(String q) { // why is q needed here? It's not used
        System.out.println(myVar);
    }

}
  

Таким образом, func2 выведет значение s ТОЛЬКО в том СЛУЧАЕ, ЕСЛИ вы сначала вызовете func1 .

 final Myclass myClass = new MyClass();
myClass.func1("value");
myClass.func2("whatever"); // will output "value"
  

Кроме того, почему методы возвращают int в вашем примере? Они должны быть недействительными.

Комментарии:

1. ‘myVar’ не может быть окончательным, если он присваивается из func1() .

2. @Guillaume вы не поняли мою точку зрения… Я хочу сказать, что func1 изменяет значение S и сохраняет его в b, затем func2 печатает это измененное значение s в терминах b

3. окончательное редактирование, спасибо, Бала Р, я не должен писать код ночью 🙂

4. Нет, пользователь841852, func2 печатает b, точка. Его не волнует, что еще произошло до или после.