2016-05-07 2 views
0

У меня есть путаница в том, как геттер и сеттер обеспечивают инкапсуляцию. Я имею в виду, какова разница между назначением значения переменной напрямую и назначением их через getter и setter. Также давайте предположим, что у нас есть два класса A & B. При использовании getter и setter для установки значений из класса B мы должны создать объект класса A в классе B, так как переменные инкапсулируются, когда мы уже знаем, в каком классе они определены.как использовать геттер и сеттер для инкапсуляции

ответ

0

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

public void setVariable(Object value) { 
    if (value == null) { 
     throw new IllegalArgumentException(); 
    } else { 
     ... 
    } 
} 

Другие возможности вы получите с устанавливающими, что вы можете применить дополнительные вычисления. Если бы у вас, например, был экземпляр BankAccount, и вы изменили бы интерес, который сеттер мог бы инициировать перерасчет процентов, которые должны быть выплачены пользователю.

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

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

Относительно вашего второго вопроса. Я не совсем понимаю вопрос. Не могли бы вы подробнее рассказать об этом.

+0

Благодарим вас за ответ. Как уже было сказано, мой второй вопрос заключается в том, что сеттер и геттер используются для инкапсуляции, как мы уже знаем. Но если мы хотим достичь этой инкапсуляции, мы должны скрыть все необходимые детали. Допустим, мы хотим изменить значение переменной, определенной в классе A из класса B. Таким образом, класс B не должен иметь ничего, кроме setter и getter, чтобы никто не знал, в каком классе или какой переменной задано значение. Но так, как это делается, нам нужно создать объект класса A в B, которым уже известно, что переменная определена в классе. –

+0

Итак, мой вопрос в том, когда мы уже знаем, в каком классе определены переменные, и мы можем напрямую изменять значения оттуда, зачем использовать гораздо более длительный процесс установки значения с помощью методов вместо назначения значений с помощью object.value –

+0

One причины этого - контроль. Вероятно, есть причина, по которой значения класса A задаются через B. Например, может быть, что класс B должен выполнить некоторую проверку/вычисление после изменения значения класса A. Если кто-то может изменить значение A, класс B никогда не узнает об изменении A, и вычисление не будет выполнено. – uniknow

0

Вы инкапсулируете переменные, объявляющие их private, чтобы другие классы не могли получить к ним доступ без метода getter или setter. Например:

private int num; //variable to-be defined from constructor 
public int getNum(){ 
return num; 
} 

Другие объекты не доступа может частный num переменная из этого объекта без использования метода getNum().

Если вы хотите изменить инкапсулированный переменную:

public void changeNum(int n){ 
num = n; 
} 

Переменная num изменяется, не нарушая синтаксис Java.

0

Getters являются публичными и сеттерами являются частными (обычно). Это означает, что любые объекты могут читать переменные нашего класса, но только объекты нашего класса могут изменять их значение. Это обеспечивает инкапсуляцию в смысле «это не дает другим объектам больше доступа, чем им нужно». Это логично, потому что наш класс - это автомобиль, а наш объект - Ferrari. Скажем, новая переменная - лошадиная сила Ferrari. Только производители Ferrari могут изменить стоимость мощности, которую дает Ferrari. Другие могут читать, а не изменять.

Ответ на второй вопрос, когда объект A сделан, вам нужно будет инициализировать все (или, по крайней мере, некоторые) переменные A. Это аналогично, по аналогии, созданию нового автомобиля Ferrari. Когда вы создадите Ferrari, вам, очевидно, придется знать все его переменные. Кроме того, здесь класс B считается «безопасным» классом, скажем, Main. B не может быть Mercedes или Audi. (Это то, о чем программист должен позаботиться, снова используя государственную/частную инкапсуляцию к классу Ferrari). У Mercedes или Audi класса не будет разрешений на создание автомобиля Ferrari. Это будет только «Главный» и «Феррари».