Из документы:
Using
@Module.subcomponents
is better since it allows Dagger to detect if the subcomponent is ever requested. Installing a subcomponent via a method on the parent component is an explicit request for that component, even if that method is never called. Dagger can’t detect that, and thus must generate the subcomponent even if you never use it.
Кто-нибудь точно понимает, что это значит?
Dagger не может сказать, вызывается ли какой-либо из ваших методов компонента: это среда времени компиляции, которая генерирует реализацию компонента и реализует каждый метод, который вы помещаете в свой интерфейс компонента.
@Component(modules = YourModule.class)
public interface YourComponent {
ClassA a();
ClassB b();
ExplicitSubcomponent createExplicitSubcomponent(Dep1 dep1, Dep2 dep2);
}
@Module(subcomponents = ImplicitSubcomponent.class)
public abstract class YourModule {
@Binds ClassC classC(DefaultClassC classCImpl);
}
В приведенном выше примере у нас есть ClassA, ClassB и ClassC. Предположим, что из всего этого вам на самом деле нужен только ClassA: они на самом деле не зависят друг от друга, и вы на самом деле не используете подкомпоненты.
b()
определено, так что кто-нибудь может когда-нибудь вызвать и попросить ClassB. Dagger не имеет представления о том, вызывает ли кто-либо b()
, поэтому он должен создавать и ссылаться на фабричные реализации для ClassB и всего, от чего ClassB зависит транзитивно.Это иллюстрирует философию Dagger по компиляции только того, что доступно из самого интерфейса компонента. Это относится и к подкомпонентам:
Конечно, если вы обрезаете свою сборку с помощью Proguard или какого-либо другого статического анализатора, эти инструменты могут удалить ненужные классы или методы. Однако в этот момент вы выполняете работу по генерации кода подкомпонента, вы выполняете работу по его компиляции в байт-код, а затем Proguard выполняет работу по его удалению. В больших проектах намного эффективнее, если вы избегаете компиляции подкомпонента, пока не узнаете, что он вам нужен, что позволяет Module.subcomponents.
Спасибо, что нашли время написать такой отличный ответ! Я случайно посмотрел сегодня это видео, которое на самом деле также отвечает на этот вопрос, оставлю ссылку здесь для будущих читателей youtube.com/watch?v=wCvXe2LsN5o&feature=youtu.be&t=1635