Почему частные методы получения нарушают инкапсуляцию, а отсутствие методов получения - нет? - PullRequest
0 голосов
/ 19 октября 2019

Я работаю над некоторыми практическими вопросами для OCP 8.

Один вопрос включал в себя класс с закрытыми полями и методами частного геттера. Правильный ответ состоял в том, что этот код нарушает инкапсуляцию, потому что методы-получатели должны были быть открытыми.

public class A {
    private String a;
    private String getA() { return a; }
}

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

public class A {
    private String a;
}

Предполагая, что все поля данных являются частными, не должны ли порядок большинства инкапсулироваться, чтобы они не содержали методов получения, частных методов получения и открытых методов получения?

Я знаю, что мой вопрос можетобоснованные, основанные на мнении, но экзамен нет.

Ответы [ 2 ]

7 голосов
/ 19 октября 2019

Частные методы получения не нарушают инкапсуляцию. Это просто чепуха.

Я не выражаю здесь мнения. Фактом является то, что закрытый метод Java может быть вызван только в пределах класса, который его объявляет. Это находится за границей инкапсуляции.

Либо вы неправильно прочитали пример вопроса и ответа OCP, либо они допустили ошибку.


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

ОБНОВЛЕНИЕ

Просмотр кода примераТрудно сказать так или иначе. Слишком нереально судить. (Код буквально бесполезен, но если мы не знаем, что было его предназначенным , мы не можем назвать этот плохой дизайн.)


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

private synchronized void setBalance(int newBalance) {
    this.balance = newBalance;
}

private synchronized int getBalance() {
    return this.balance;
}

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

И есть другое, что частный добытчик мог бы законно сделать.

0 голосов
/ 19 октября 2019

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

...