2017-02-16 2 views
2

Так что мой преподаватель сказал что-то вдоль линий:Какие проблемы обслуживания связаны с защищенным переменными в Java

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

Но он не объяснил, какие проблемы с обслуживанием были. Какие проблемы существуют, если подклассы могут обращаться к переменным.

Im довольно новое для Java, поэтому простое объяснение было бы более полезным

ответ

5

Предположим, что вы пишете класс с переменной в protected экземпляра:

public class A { 
    protected int c; 
} 

Теперь кто-то может расширить свой класс и использовать переменную c непосредственно:

public class B extends A { 
    public void someMethod() { 
     System.out.println(c + 5); 
    } 
} 

Теперь B зависит от c член вашего класса A. Если завтра вы решите удалить эту переменную или переименовать ее или изменить ее тип, то B не будет передавать компиляцию.

Когда вы делаете c частным и поставляете геттер и сеттер, чтобы получить к нему доступ, у вас есть свобода в изменении c без нарушения классов, которые расширяют ваш класс.

+0

«если ... вы решили удалить эту переменную или переименовать ее или изменить ее тип». Но это также проблема с геттерами: вы также не можете использовать ни одну из этих вещей для методов. –

+0

(Возможно, я неправильно читаю «тип» здесь, я полагаю, вы могли бы означать «представление») –

+1

@AndyTurner Это правда, но вы можете изменить внутреннюю реализацию методов, которые используют переменные экземпляра, не нарушая никакого кода, который вызывает эти методы. Например, метод getter может возвращать значение некоторой частной переменной экземпляра, а позже вы можете решить, что эту переменную можно устранить, а метод getter вернет значение, вычисленное на основе других переменных. – Eran

1

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

1

Отъезд Эффективная Java 2nd Ed Пункт 14: «В общедоступных классах используйте методы доступа, а не общедоступные поля».

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

Особенно актуальна цитата:

Вы не можете изменить представление без изменения API, вы не можете применять инварианты, и вы не можете принять вспомогательное действия, когда поле доступно ,

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

Смежные вопросы