В RegEx {i,f}
означает, что «между i
и f
соответствует». Давайте посмотрим на следующие примеры:
{3,7}
означает от 3 до 7 соответствий {,10}
означает до 10 совпадений без нижнего предела (т.е. нижний предел равен 0) {3,}
означает не менее 3 совпадений без верхнего предела (т.е. верхний предел бесконечен) {,}
означает, что верхний предел или нижний предел для количество совпадений (т. е. нижний предел равен 0, а верхний предел бесконечен) {5}
означает ровно 4 Большинство хороших языков содержат сокращения, RegEx:
+
является сокращением для {1,}
*
является сокращением для {,}
?
является сокращенное значение для {,1}
Это означает, что +
требует не менее 1 совпадения, в то время как *
принимает любое количество совпадений или не имеет совпадений вообще, а ?
принимает не более 1 совпадающие или нулевые.
Кредит: Codecademy.com
Хотя я не знаю точно, я бы предположил, что у Scopes обязательно есть сохранение во время выполнения, потому что JSR 330's @Scope
требует, чтобы облавы имели время хранения во время выполнения. ( @Qualifier
имеет такое же ограничение.) Оба Dagger 1 и Dagger 2 рекламируют совместимость JSR-330, и (как упоминает David в комментариях) существует много времени выполнения которые должны были бы абсолютно требовать аннотации аннотаций, сохраненных во время выполнения.
Для кинжала, в частности, я не могу себе представить, почему они действительно будут прочитаны во время выполнения, хотя я полагаю, что некоторые внешние библиотеки могут использовать аннотации.
Это не обязательно проблема, унаследованное или иное: многие системы DI настраиваются во время выполнения и требуют аннотации. Кинжал примечателен тем, что он этого не делает, но спецификация не была написана таким образом, чтобы удержание времени исполнения было необязательным. Это освобождает разработчиков приложений вместо Dagger с другой структурой JSR330, такой как Guice или Spring, и освобождает разработчиков библиотек, чтобы сделать совместимые с DI-совместимыми инструментами или фреймворками агностики, независимо от того, настроены ли они во время компиляции или настройки времени выполнения. Эта спецификация (т. Е. Без вариантов реализации) и гибкость (время компиляции или время выполнения), по-видимому, стоят затрат на ненужное сохранение аннотации и стоимость обучения.
Однако этот может проблема в крупных приложениях для Android, потому что Android по умолчанию по умолчанию сохраняет аннотированные классы в главном дескрипторе ; более старые версии Android не загружают аннотации времени выполнения, если аннотированный класс находится во вторичном dex. Подробнее см. В эту ошибку , связанную с keepRuntimeAnnotatedClasses
docs . Хотя вы могли бы рассмотреть эту проблему с кинжалом из-за применимости Dagger к большим приложениям для Android, это скорее ошибка с обработкой аннотаций Android, для которой Кинжал должен будет расходиться с спецификацией JSR-330, чтобы справиться с ней.