Доверяющие подклассы
Билл Веннерс: Должен ли я доверять подклассам более глубоко, чем
не-подклассы? Например, я делаю
это проще для подкласса
реализация сломать меня, чем я
будет для не подкласса? В
в частности, как вы относитесь к
защищенные данные?
Джош Блох: Чтобы написать что-то подклассовое и надежное
против вредоносного подкласса
на самом деле довольно сложная вещь,
при условии, что вы даете доступ к подклассу
к вашим внутренним структурам данных. Если
у подкласса нет доступа к
все, что обычный пользователь
нет, тогда это сложнее для
подкласс для нанесения ущерба. Но если вы
сделайте все ваши методы окончательными,
подкласс все еще может сломать ваш
контракты, просто делая неправильно
вещи в ответ на метод
призывание. Именно поэтому
критические классы безопасности, такие как String
являются окончательными. В противном случае кто-то мог
написать подкласс, который делает строки
казаться изменчивым, что было бы
достаточно, чтобы сломать безопасность. Так что вы
должен доверять своим подклассам. если ты
не верь им, тогда ты не сможешь
их, потому что подклассы могут так легко
заставить класс нарушать его
контракты.
Что касается защищенных данных в целом,
это неизбежное зло. Так должно быть
сведено к минимуму. Наиболее защищенные данные
и защищенные методы составляют
обязательство к реализации
подробно. Защищенное поле является
детали реализации, что вы
делая видимым для подклассов. Даже
Защищенный метод является частью
внутренняя структура, которую вы делаете
видимый для подклассов.
Причина, по которой вы делаете это видимым, заключается в том, что
это часто необходимо для того, чтобы
подклассы, чтобы сделать свою работу, или сделать
это эффективно. Но как только вы сделали
это, вы привержены этому. Сейчас
то, что вам не разрешено
изменить, даже если вы позже найдете более
эффективная реализация, что нет
дольше предполагает использование
конкретное поле или метод.
Итак, при прочих равных условиях вы
не должно быть никаких защищенных членов
совсем. Но это сказал, если у вас слишком
мало, тогда ваш класс не может быть использован
как супер класс, или, по крайней мере, не так
эффективный супер класс. Часто ты
узнай по факту. Моя философия
должен иметь как можно меньше защищенных членов
возможно, когда вы впервые напишите
учебный класс. Тогда попробуйте сделать его подклассом. Вы
может обнаружить, что без определенного
защищенный метод, все подклассы будут
должен сделать что-то плохое.
Например, если вы посмотрите на
AbstractList
, вы обнаружите, что там
это защищенный метод для удаления
диапазон списка в один выстрел
(removeRange
). Почему это там?
Потому что нормальная идиома для удаления
диапазон, основанный на общедоступном API,
позвоните subList
, чтобы получить суб- List
,
а затем позвоните clear
на этом
суб- List
. Без этого конкретного
защищенный метод, однако, единственный
вещь, которую clear
мог бы сделать, это
неоднократно удаляйте отдельные элементы.
Подумай об этом. Если у вас есть массив
представление, что это будет делать? Это
будет многократно свернуть массив,
выполняю заказ N работаю N раз. Так будет
взять квадратичное количество работы,
вместо линейного объема работы
что должно. Предоставляя это
защищенный метод, мы разрешаем любой
реализация, которая может эффективно
удалить весь диапазон, чтобы сделать это. А также
любая разумная List
реализация
может удалить диапазон более эффективно
все сразу.
что нам нужно это защищено
метод это то, что вам нужно
быть умнее меня, чтобы узнать
фронт. В основном я реализовал
вещь. Затем, как мы начали подкласс
это, мы поняли, что удаление диапазона было
квадратичная. Мы не могли себе этого позволить, поэтому
Я положил в защищенном способе. Я думаюэто лучший подход с
защищенные методы. Вставьте всего лишь
возможно, а затем добавьте больше по мере необходимости.
Защищенные методы представляют
обязательства по проектам, которые вы можете
хочу изменить. Вы всегда можете добавить
защищенные методы, но вы не можете взять
их.
Билл Веннерс: А защищенные данные?
Джош Блох: То же самое, но даже больше. Защищенные данные еще больше
опасно с точки зрения испортить ваш
инварианты данных. Если вы даете кому-то
иначе доступ к некоторым внутренним данным,
у них есть свобода правления над ним.
Короткая версия: нарушает инкапсуляцию, но это необходимое зло, которое должно быть сведено к минимуму.