Как сделать область видимости переменной Global (не делая ее фактически глобальной) - PullRequest
0 голосов
/ 29 сентября 2011

Как сделать глобальную область видимости переменной String (в 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

    }

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

Ответы [ 2 ]

6 голосов
/ 29 сентября 2011

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

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

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.Это не замедляет работу вашего приложения и не убивает вас при вводе нескольких дополнительных букв.

1 голос
/ 29 сентября 2011

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

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 в вашем примере? Они должны быть недействительными.

...