Как изменить приватную статическую переменную через метод setter - PullRequest
14 голосов
/ 26 июля 2011

У меня есть следующая переменная в классе с именем Пример:

private static int number;

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

1) Сделайте метод set в Примере статическим, чтобы я мог получить к нему доступ следующим образом:

Example.setNumber(3);

2) или сделать метод установки нестатичным, чтобы я создал объект Example для установки числа

Example e = new Example()
e.setNumber(3);

В чем различия между этими двумя и какой из них лучше?

Ответы [ 10 ]

12 голосов
/ 26 июля 2011

В этом случае рекомендуется использовать статический метод.

Почему?Что ж, если вы сделаете это нестатическим методом, это приведет к следующему удивительному эффекту:

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...
5 голосов
/ 26 июля 2011

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

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

4 голосов
/ 26 июля 2011

Первый будет правильным.Когда вы обращаетесь к статическому методу, вы используете имя класса, а не объект refrence

3 голосов
/ 26 июля 2011

Пожалуйста, не используйте второй вариант. Создание экземпляра только для присвоения является преступлением: P. Используйте первый вариант или просто сделайте number общедоступным, в зависимости от ваших потребностей.

3 голосов
/ 26 июля 2011

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

2 голосов
/ 26 июля 2011

Статический член одинаков для всех экземпляров класса. Вы можете изменить либо с помощью статического или обычного сеттера. Но обычный установщик в этом случае может сбить пользователя с толку: соглашение об именах говорит, что установщик изменяет значение поля, которое принадлежит конкретному экземпляру. Поэтому вы должны использовать первую версию: Example.setNumber(3).

2 голосов
/ 26 июля 2011

Нет смысла создавать экземпляр класса просто для установки на него статической переменной.Я бы пошел с # 1.(Хотя я стараюсь избегать глобальных переменных, то есть статической переменной.)

2 голосов
/ 26 июля 2011

Установщик статической переменной, которая не зависит ни от каких переменных / функций экземпляра, также должен быть статическим. Итак 1).

Но остерегайтесь создания глобальных переменных!

1 голос
/ 26 июля 2011

Консенсус других постеров для статического метода # 1.

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

1 голос
/ 26 июля 2011

Статические переменные сделаны статическими , потому что они не связаны с каким-либо конкретным объектом.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...