#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, точка. Его не волнует, что еще произошло до или после.