At one point in the early days of Dagger we toyed with the idea of using
the term @Contributes instead of @Provides as part of cleaming the
terminology up.  Using @Bind or @Binds would also be good.  We stayed with
@Provides because it was a known quantity and not _that_ confusing.  Guice,
of course, has the larger problem of a huge install base so altering the
configuration language primitives becomes a burden - either to maintain
backward compatibility or to forward-migrate folks.

But for what it's worth, when I see @Provides I think
"@ConfiguresABindingFor" with reference to the return type or the qualified
return type. That conceptual mapping might make it easier.

-christian.

On Fri Oct 17 2014 at 9:32:15 AM Tim Peierls <t...@peierls.net> wrote:

> On Thu, Oct 16, 2014 at 7:19 PM, Kevin Burton <burtona...@gmail.com>
> wrote:
>
>> I humbly propose that these concepts are rather confusing in Guice
>>
>> @Provides vs Providers
>>
>> They both use similar mechanisms... IE providing the value of an object,
>> but they do it differently and the semantics are confusing.
>>
>
> Here's one way to think about it:
>
> @Provides appears *only *when configuring bindings with a Module.
> Annotating a Module method with @Provides -- and possibly some scoping
> annotation -- sets up a binding that means "this method is how to provide
> an instance of the return type (in the specified scope, if any)". You won't
> see it in regular code. It's a very convenient shorthand for something that
> can be accomplished more clumsily with explicit calls to bind() and custom
> providers.
>
> Provider<T> mainly shows up at injection points in regular code. (Another
> place you'll see it is as the supertype of a custom provider, but many of
> those cases can be expressed more simply with @Provides.) At an injection
> point, it means "instead of injecting a T directly, I'm giving you a way to
> get() an instance of T". It doesn't promise any more than that. In
> particular, it doesn't mean that you'll get a new instance of T every time
> you call get() -- though you might.
>
>
>
>> So when I see Provider<Foo> ... I don't know if that call is potentially
>> expensive the first time.
>>
> I also don't know if I'm going to get one object (a singleton) or lots of
>> them.
>>
> Or if it's a rather simple object to instantiate it's just that we're
>> doing so lazily.
>>
>
> All correct, but you typically won't be presented with a Provider<Foo> in
> the wild; *you'll *be writing code that needs to be injected with a Foo,
> and *you'll* know of some reason that you want to defer provision of the
> Foo to some point under your control *after *the injection point -- and
> it could be for any of the three things you mention, or for something like
> circularity -- that's when you'll use Provider<Foo> instead.
>
> If you *do *find yourself facing a Provider<Foo> at an injection point,
> you should assume that the person who put it there wants to defer the
> provision of a Foo until one is actually needed, at which point you call
> get(). It's also safe to assume that you should call get() every time you
> need a Foo in the context of the injection point. If it's bound as a
> singleton, no harm done; if it's bound in some other kind of scope (or
> unscoped) you'll be making sure that you're getting a correctly-scoped
> instance.
>
> --tim
>
> --
> 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+unsubscr...@googlegroups.com.
> To post to this group, send email to google-guice@googlegroups.com.
> Visit this group at http://groups.google.com/group/google-guice.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/google-guice/CA%2BF8eeS%3DH5GoLqciM1Hjg4M1NLgY1QoaehUToWzy0fZLSAcfiA%40mail.gmail.com
> <https://groups.google.com/d/msgid/google-guice/CA%2BF8eeS%3DH5GoLqciM1Hjg4M1NLgY1QoaehUToWzy0fZLSAcfiA%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
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+unsubscr...@googlegroups.com.
To post to this group, send email to google-guice@googlegroups.com.
Visit this group at http://groups.google.com/group/google-guice.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/google-guice/CAHsNDCRx8nqCE7X09tJpHn%2Bxm0oqp2V3iEodCuwB9nr5vsf0rg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to