Как изменить приватную статическую переменную через метод 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.