// Previously, our Api looks like this:
@Component(modules = ApiManagerModule.class)
public interface ApiComponent {
@Component.Builder
interface Builder {
ApiComponent build();
}
ApiManager apiManager();
}
@Module
public interface ApiManagerModule {
@Binds
ApiManager bindApiManager(ApiManagerImpl impl);
}
// User uses our API like:
ApiComponent apiComponent =
DaggerApiComponent.builder().build();
ApiManager apiManager = apiComponent.apiManager();
apiManager.doApiThings();
For some reason, we want to add an option object to our api. We made following changes:
@Component(modules = ApiManagerModule.class)
public interface ApiComponent {
@Component.Builder
interface Builder {
ApiComponent build();
// **new**
@BindsInstance
Builder setApiOptions(ApiOptions options);
}
ApiManager apiManager();
}
@Module
public interface ApiManagerModule {
@Binds
ApiManager bindApiManager(ApiManagerImpl impl);
}
// **new**
@AutoValue
public abstract class ApiOptions {
//...
@AutoValue.Builder
public abstract static class Builder {
//...
}
}
// User will now use our Api like:
ApiComponent apiComponent = DaggerApiComponent.builder()
.setApiOptions(
ApiOptions.builder()
/*setters*/
.build());
ApiManager apiManager = apiComponent.apiManager();
apiManager.doApiThings();
However, one issue is this is a breaking change. Users already integrated to our API has to make changes to set the @BindsInstance option object.
My question is, is it possible to provide fallback value for the @BindsInstance option object? We want to have something like this:
ApiComponent apiComponent =
DaggerApiComponent.builder()
// when `setApiOptions()` is not called, a default ApiOptions is created and provided.
.build();
ApiManager apiManager = apiComponent.apiManager();
apiManager.doApiThings();