Skip to content

Share a single SwitchingProviderImpl instance across SingleCheck and DoubleCheck providers in fastInit mode. - #5262

Merged
copybara-service[bot] merged 1 commit into
masterfrom
test_944582946
Oct 21, 2026
Merged

copybara-service[bot] merged 1 commit into
masterfrom
test_944582946

Conversation

@copybara-service

@copybara-service copybara-service Bot commented Sep 4, 2026 •

Copy link
Copy Markdown

Share a single SwitchingProviderImpl instance across SingleCheck and DoubleCheck providers in fastInit mode.

Previously in Dagger's fastInit mode, each scoped provider (SingleCheck, DoubleCheck) or assisted factory instantiated a dedicated SwitchingProvider instance:

    this.fooFactoryProvider = SingleCheck.provider(new SwitchingProvider<>(componentImpl, 0));

This change introduces dagger.internal.SwitchingProvider and shares a single SwitchingProviderImpl instance across all scoped and assisted factory bindings within a component:

  1. Introduce the dagger.internal.SwitchingProvider<T> interface with a parameterized T get(int id) method, implemented by the generated SwitchingProviderImpl<T> inner class.
  2. Add dagger.internal.SingleCheckSwitchingProvider and dagger.internal.DoubleCheckSwitchingProvider that accept a shared SwitchingProvider<?> and binding int id.
  3. In component implementations, generate a single shared private SwitchingProviderImpl<Object> sharedSwitchingProvider instance initialized with id = -1 and passed to SingleCheckSwitchingProvider.provider(sharedSwitchingProvider, id) and DoubleCheckSwitchingProvider.provider(sharedSwitchingProvider, id).
  4. Unscoped bindings continue to instantiate SwitchingProviderImpl directly as a Provider<T>.

This reduces redundant SwitchingProvider object allocations during component initialization in fastInit mode.

RELNOTES=n/a

@copybara-service copybara-service Bot changed the title Share a single SwitchingProvider instance across SingleCheck and DoubleCheck providers in fastInit mode. Share a single SwitchingProviderImpl instance across SingleCheck and DoubleCheck providers in fastInit mode. Oct 21, 2026
…DoubleCheck providers in fastInit mode.

Previously in Dagger's fastInit mode, each scoped provider (SingleCheck, DoubleCheck) or assisted factory instantiated a dedicated SwitchingProvider instance:
```java
    this.fooFactoryProvider = SingleCheck.provider(new SwitchingProvider<>(componentImpl, 0));
```
This change introduces `dagger.internal.SwitchingProvider` and shares a single `SwitchingProviderImpl` instance across all scoped and assisted factory bindings within a component:
1. Introduce the `dagger.internal.SwitchingProvider<T>` interface with a parameterized `T get(int id)` method, implemented by the generated `SwitchingProviderImpl<T>` inner class.
2. Add `dagger.internal.SingleCheckSwitchingProvider` and `dagger.internal.DoubleCheckSwitchingProvider` that accept a shared `SwitchingProvider<?>` and binding `int id`.
3. In component implementations, generate a single shared `private SwitchingProviderImpl<Object> sharedSwitchingProvider` instance initialized with `id = -1` and passed to `SingleCheckSwitchingProvider.provider(sharedSwitchingProvider, id)` and `DoubleCheckSwitchingProvider.provider(sharedSwitchingProvider, id)`.
4. Unscoped bindings continue to instantiate `SwitchingProviderImpl` directly as a `Provider<T>`.

This reduces redundant SwitchingProvider object allocations during component initialization in fastInit mode.

RELNOTES=n/a
PiperOrigin-RevId: 1004298929
@copybara-service
copybara-service Bot merged commit abde6c6 into master Oct 21, 2026
1 check passed
@copybara-service
copybara-service Bot deleted the test_944582946 branch October 21, 2026 23:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant