Java сеттер и геттер? - PullRequest
       25

Java сеттер и геттер?

1 голос
/ 08 февраля 2012

Все знают, что Java поддерживает скрытие данных.

Я пошел на собеседование.Затем интервьюер спросил меня, что если Java поддерживает сокрытие данных, используя private в качестве типа данных.

Он сказал, что если мы используем установщики и получатели в этом классе, то с помощью этих установщиков и получателей мы сможем легко получить эти личные данные.

Так как это поддерживает данные, скрывающиеся здесь?

Возможно, он пытался меня поймать в ловушку.Но я не мог ответить на это.

Что мне ответить на это?

Ответы [ 13 ]

5 голосов
/ 08 февраля 2012

Он утверждал, что если «сокрытие данных» является принципом ООП, то не нарушаем ли мы его, выставляя через геттеры и сеттеры.Я думаю, он хотел, чтобы вы объяснили принципиальную разницу между возможностью прямого доступа к элементу данных и выполнением его с помощью метода получения или установки.В первом случае клиент класса может неправильно обрабатывать данные, присваивая ему значение, которое разработчик класса не разработал для обработки класса (например, установите возраст учащегося на 500).В последнем (с использованием установщика) конструктор класса наложил определенные ограничения на то, какие значения могут быть назначены данным.В примере с возрастом установщик может выглядеть примерно так:

void setAge(int age) {
if(age<3 || age>100) 
  return;
this.age=age;
}

при условии, что ученики в возрасте до 3 лет и старше 100 не допускаются.Таким образом, вы все еще скрываете свои данные, но позволяете средствам манипулировать ими в соответствии с логикой вашего модуля.

4 голосов
/ 08 февраля 2012

Очень простой пример:

Версия 1 класса может иметь такой геттер.

public int getTotal() {
   return total_;
}

Версия 2 может сделать это

public int getTotal() {
  return a + b;
}

Мы изменили способ реализации класса, но клиенты класса также не должны меняться, потому что данные скрыты за геттером.

2 голосов
/ 08 февраля 2012
protected String name;

public void setName(String newName){
    if(newName.length() > 5) this.name = newName
}

public String getName(){
    return this.name;
}

В этом простом случае к атрибуту name можно обратиться по его имени в этом классе и во всех его дочерних элементах. Если вы хотите установить значение name из несвязанного класса, вам придется использовать метод setName(), где вы можете применить некоторую проверку, например.

Здесь вы можете найти любую необходимую информацию об этих специальных методах.

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

2 голосов
/ 08 февраля 2012

Поля класса скрыты, если мы их объявим private. Без сомнения (мы игнорируем неприятные уловки отражения). Если мы хотим сделать доступными значения , мы предоставляем методы доступа (например, getter / setter).

Но нет необходимости предоставлять геттеры и сеттеры для всех полей или называть их в соответствии с полями (в целом).

Внутренние элементы класса (поля) совершенно скрыты.

2 голосов
/ 08 февраля 2012

Сокрытие данных - плохой термин, лучше сказать инкапсуляция данных. В java доступ к закрытым членам осуществляется через аксессоры и мутаторы (getter и setter), все дело в том, чтобы скрывать и контролировать доступ к вашим членам, чтобы вы могли контролировать, как будет изменяться внутреннее состояние экземпляра.

Я думаю, что если вы упомянете что-нибудь о java отражении / метаданных -> вы получите бонусные баллы

1 голос
/ 08 февраля 2012

Бьюсь об заклад, он ждал, что вы также будете ссылаться на «неизменяемые» типы.

PD. private - это не тип, это модификатор доступа.

1 голос
/ 08 февраля 2012

То, о чем вы говорите, похоже Инкапсуляция .По сути, методы получения и установки позволяют вам выставлять переменные класса так, как вам нравится, и скрывать любые другие.Методы получения и установки также позволяют вам выполнять любые другие необходимые шаги, такие как проверка.

Методы получения и установки могут сами иметь разные модификаторы доступа, поэтому вы можете предоставлять данные определенным классам, но не другим, используя разные модификаторы доступа.

1 голос
/ 08 февраля 2012

Поддержка «сокрытия данных» может быть объяснена тем фактом, что методы получения и установки похожи на шлюзы к данным.

Только по соглашению - если быть точным, соглашение JavaBeans - от них ожидается, что они будут работать с членом, в честь которого они названы.Они могли бы сделать что-нибудь еще, и это все равно было бы идеально компилируемым и легальным java.

0 голосов
/ 14 февраля 2012

Скрытие данных и инкапсуляция часто ошибочно принимаются за безопасность впервые учащимися.Важно понимать, что скрытие и инкапсуляция данных не имеют ничего общего с безопасностью.

Эти концепции существуют для того, чтобы гарантировать, что наследование класса A от класса B (класс B расширяет A) не наследует «инкапсулированный»члены.

Надеюсь, это прояснит ваше замешательство, а также побудит вас больше читать и учиться.Ваш вопрос очень важен для концепций OOPS.И интервьюер не пытается загнать в угол, вы задаете очень простые вопросы об OOPS.Учиться усердно !!!

0 голосов
/ 08 февраля 2012

Как уже указывалось в некоторых ответах, set / get не нужно фактически устанавливать или возвращать фактические члены.

Например, допустим, у вас есть класс Coordinate с set / get для (x, y). Внутренняя реализация может быть основана на полярных координатах:

private double radius;
private double angle;

и get / set для (x, y) выполняют преобразование координат с помощью sin и cos.

Вы можете изменить реализацию класса на любую другую систему координат по желанию и при этом просто оставить set / get for (x, y) в качестве открытых методов.

Итак, подведя итог, я могу ответить на этот вопрос следующим образом: открытый интерфейс класса может предоставлять set / get, но фактическая реализация может (и должна) быть скрыта, делая все члены частными (или защищенными). Таким образом, мы можем сказать, что общедоступный набор / получение личных данных - это «скрытие реализации», а не скрытие данных.

...