4

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

В частности, я говорю о TextInputLayout в Android Design Support Library. Например, если я хочу создать собственный виджет, который переопределяет некоторый код в конструкторе, я не могу этого сделать, потому что CollapsingTextHelper не является общедоступным. Мне нужно будет загрузить исходный код и скопировать соответствующие классы в мой проект, но на самом деле нет ничего, что мешало бы мне делать это в любом случае. Итак, в чем смысл не публиковать его в первую очередь?

Как я понимаю, поскольку библиотека обновляется и улучшается с течением времени, вы можете просто добавить аннотацию @Deprecated, чтобы указать, что определенный класс устарел или устарел и все еще существует, чтобы предотвратить нарушение устаревшего кода.
Я знаю, что для библиотеки нет смысла просто публиковать все классы, но я не понимаю, почему классы, необходимые для реализации виджета, не должны быть общедоступными. Почему они не могут просто добавить аннотацию @Deprecated, когда один из классов заменяется лучшей версией или когда виджеты реализованы совсем другим способом?

+3

Можете ли вы уточнить? Это можно трактовать как широко, так как спрашивать, каковы преимущества инкапсуляции OO. –

+0

Вы пытаетесь создать собственный виджет, но не хотите расширять его из класса виджетов Android. (вы случайно написали суперкласс, он должен быть подклассом). Почему вы не хотите распространяться из класса виджетов? Любая причина? – luckylukein

+0

Я отредактировал свой вопрос, чтобы надеяться, выяснить, что я действительно спрашивал. Если он все еще запутан или неясен, тогда, может быть, мой вопрос просто глупо. Но по крайней мере я буду знать, почему вы знаете – charliebeckwith

ответ

7

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

Посмотрите, сколько методов или классов @Deprecated уже есть, и вы поймете, почему это важно.

+0

Я отредактировал мое сообщение с моим ответом на это. Можете ли вы сообщить мне свои мысли? – charliebeckwith

+2

Проблема @Solarnum с обесцениванием заключается в том, что даже если вы можете аннотировать класс как «Устаревший» и просто писать новый с нуля, вы все еще ** имеете ** для поддержки старой версии, поскольку прежний код по-прежнему будет зависеть от него. Конечно, это не то, что вы не можете сделать. Но если вы повторите эту процедуру снова и снова, ваша кодовая база просто станет беспорядком. Другая причина для непубличных классов (в частности, для пакетов-частных) заключается в том, что они обычно содержат некоторую сложную логику, которая требует глубокого знания базовой структуры (которая также может измениться) - это особенно верно для UI –

+0

Perfect. Большое спасибо! – charliebeckwith

1

По той же причине каждый другой класс/поле/переменная в java (и не только) имеет модификаторы доступа.

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

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

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

3

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


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

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

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

В Android Studio или IntelliJ вы можете просмотреть исходный код библиотеки поддержки с просто щелкнув правой кнопкой мыши на классе и выборе "Go to" -> "Declaration" или с этими ярлыками:

  • Mac: + B
  • Окна: Ctrl + B

Оттуда довольно просто скопировать соответствующие классы в ваш проект, изменить их и использовать, как вам нравится.


Достаточно сказать, что в 99% случаев вам все равно не понадобится. Google, несомненно, много думал о том, какие классы должны быть общедоступными и, как результат, являются частью API и которые являются частью реализации виджета.

+0

Вы также можете ⌘ + щелкнуть имя класса, и оно приведет вас к исходному документу. Благодаря! Я предполагаю, что я просто думал, что вместо того, чтобы делать классы непубличными, может быть просто аннотация, такая как @Unsupported или что-то подобное, но это довольно практичный случай для чего-то, что нужно будет широко использовать с помощью простой ручной работы вокруг ха-ха ..... Итак, все имеет смысл. – charliebeckwith