Yeah - I can see Dagger borrowing back the approach for Optional
provides, though having no access to an Optional in dagger is tricky
(targeting Java6 without non-JSR dependencies, like Guava). We'll have
to figure it out. At least we might be able to do the default approach
though.
c.
On 2 Apr 2014, at 7:37, Tavian Barnes wrote:
> I like it, similar to what Dagger has for @Provides(SET).
>
> I also really like OptionalBinder. Previously I used
> Modules.override(new
> OverridableBindingsModule(), ...) to provide default implementations.
>
> On Wednesday, 2 April 2014 09:41:45 UTC-4, Sam Berlin wrote:
>>
>> I've been thinking also about some kind of syntax like:
>>
>> MyModule extends AbstractModule {
>> configure() { install(Multibindings.forModule(this)); }
>> @OptionalProvides(DEFAULT) Foo provideDefaultFoo(..) { .. }
>> @OptionalProvides(ACTUAL) Foo provideActualFoo(..) { .. }
>> @SetProvides Foo provideItemForSetOfFoo(..) { .. }
>> @MapProvides MapBinderEntry<Key, Foo> provideItemForMapOfKeyToFoo(..)
>> {
>> .. }
>> }
>>
>> ... need to experiment and see if those pan out.
>>
>> sam
>>
>>
>> On Wed, Apr 2, 2014 at 9:20 AM, Filipe Sousa
>> <
nat...@gmail.com<javascript:>
>>> wrote:
>>
>>> That's excellent
>>>
>>>
>>>
>>> On Wed, Apr 2, 2014 at 1:33 AM, Sam Berlin
>>> <
sbe...@gmail.com<javascript:>
>>>> wrote:
>>>
>>>> Ever wanted to:
>>>> 1) Set default binding in a library or framework that users can
>>>> change?
>>>> 2) Inject something into a library or framework that isn't
>>>> required,
>>>> but would be better if a user could set it?
>>>> 3) Inject an optional value into a constructor?
>>>>
>>>> OptionalBinder lets you do that. Christian just pushed out some of
>>>> our
>>>> recent internal changes, including the introduction of
>>>> OptionalBinder to
>>>> the multibindings extension.
>>>>
>>>> Some example usage:
>>>>
>>>> 1) Setting a default binding that a user can override:
>>>> Library: *OptionalBinder.newOptionalBinder(binder(), Foo.class)*
>>>> * .setDefault().to(DefaultFoo.class);*
>>>> At this point, code can inject '*Foo*' (or *Optional<Foo>)*, and
>>>> will get a *DefaultFoo.*
>>>>
>>>> User: *OptionalBinder.newOptionalBinder(binder(), Foo.class)*
>>>> * .setBinding().to(CustomFoo.class);*
>>>> Once a user calls setBinding(), injections of *Foo* (or
>>>> *Optional<Foo>)* will start providing *CustomFoo* instead.
>>>>
>>>> 2) Setting a binding that isn't required (e.g, no default value),
>>>> but a
>>>> user can supply.
>>>> Library: *OptionalBinder.newOptionalBinder(binder(), Foo.class);*
>>>> At this point, code *can't* inject *Foo* -- it will fail saying the
>>>> binding isn't supplied. Code *can* (and should) inject
>>>> *Optional<Foo>*,
>>>> though, and the optional will be absent.
>>>>
>>>> User: *OptionalBinder.newOptionalBinder(binder(), Foo.class)*
>>>> * .setBinding().to(CustomFoo.class);*
>>>> Once a user calls setBinding(), *Optional<Foo>* will be present and
>>>> supply the *CustomFoo*. Also, *Foo* can be directly injected now
>>>> (although only user could should do that, since the user code is
>>>> the only
>>>> part that guarantees the binding will be there -- library code
>>>> should still
>>>> inject the* Optional<Foo>*).
>>>>
>>>> Please report back if you have any issues or suggestions for
>>>> improvement.
>>>>
>>>> Thanks!
>>>>
>>>> sam
>>>>
>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "google-guice" group.
>>>> To unsubscribe from this group and stop receiving emails from it,
>>>> send
>>>> an email to
google-guice...@googlegroups.com <javascript:>.
>>>> To post to this group, send email to
>>>>
google...@googlegroups.com<javascript:>
>>>> .
>>> email to
google-guice...@googlegroups.com <javascript:>.
>>> To post to this group, send email to
>>>
google...@googlegroups.com<javascript:>
>>> .
Christian Gruber :: Google, Inc. :: Java Core Libraries :: Dependency
Injection
email:
cgr...@google.com :::: mobile:
+1 (646) 807-9839