Как изменить приватную статическую переменную через метод setter
У меня есть следующая переменная в классе с именем Example:
private static int number;
Если бы я хотел назначить переменную число с использованием внешнего класса, что бы я сделал?
1) Сделайте метод setter в примере static, чтобы я мог получить доступ к нему следующим образом:
Example.setNumber(3);
2) или Сделать метод setter нестационарным, поэтому я создаю объект примера для установки числа
Example e = new Example()
e.setNumber(3);
Каковы различия между ними и какой из них лучше?
Ответы
Ответ 1
В этом случае рекомендуется использовать статический метод.
Почему? Ну, если вы сделаете его нестационарным, это приведет к следующему эффекту:
Example e1 = new Example();
Example e2 = new Example();
e2.setNumber(3);
e1.setNumber(5);
System.out.println(e2.getNumber()); // surprise! prints 5,
Таким образом, даже если вы вызвали метод на e1, также влияет e2. Соответствующий статический пример гораздо менее удивителен:
Example e1 = new Example();
Example e2 = new Example();
Example.setNumber(5);
System.out.println(Example.getNumber()); // prints 5, no surprise...
Ответ 2
Прежде всего, вы действительно не должны устанавливать статические переменные. Он подвержен проблемам, и это обычно указывает на плохой дизайн. Использовать только статические переменные, которые должны использоваться только для потокобезопасных неизменяемых объектов и синглтонов.
Тем не менее, если вы все еще хотите установить значение, сделайте его статическим методом, поскольку вам не нужно создавать экземпляр объекта, чтобы установить статическое значение.
Ответ 3
Первый будет правильным. Когда вы обращаетесь к статическому методу, вы используете имя класса, а не refrence объекта
Ответ 4
Если это статическая переменная, сделайте статическую установку. Необходимость создания экземпляра только для изменения того, что принадлежит всему классу, является многословной и расточительной.
Ответ 5
Пожалуйста, не используйте второй вариант. Создание экземпляра только для задания - преступление: P.
Используйте первый вариант или просто сделайте number
общедоступным, в зависимости от ваших потребностей.
Ответ 6
Установщик статической переменной, который не зависит от каких-либо переменных/функций экземпляра, также должен быть статическим. Итак, 1).
Но будьте осторожны с созданием глобальных переменных!
Ответ 7
Нет смысла создавать экземпляр класса только для установки на нем статической переменной. Я бы пошел с №1. (Хотя я стараюсь избегать глобальных переменных, что является статической переменной.)
Ответ 8
Статический член одинаковый для всех экземпляров класса. Вы можете изменить либо использование статического, либо обычного сеттера. Но обычный сеттер в этом случае может смутить пользователя: в соглашении об именах говорится, что сеттер изменяет значение поля, которое принадлежит определенному экземпляру. Поэтому вы должны использовать первую версию: Example.setNumber(3)
.
Ответ 9
Статические переменные становятся статическими, поскольку они не связаны с каким-либо конкретным объектом.
Оба подхода работают, но первый более разумный, потому что он не требует создания и использования произвольного объекта.
Ответ 10
Консенсус других плакатов для статического метода # 1.
Я буду утверждать, что мы не можем ответить на вопрос имеющейся информацией. Если, например, метод setNumber необходим для реализации интерфейса, то это должен быть метод экземпляра # 2. Сообщите нам, где будет использоваться метод setNumber.