That's a great suggestion, especially if you're not planning on using the
assisted side of assisted injection. Note that MapBinder will also create a
binding for Map<String, Provider<Action>> if you don't want your Action
instances to be treated as singletons.

On Wed, May 27, 2015 at 12:27 AM Fred Faber <[email protected]> wrote:

> Not taking away from other suggestions, but it's fairly idiomatic to use a
> MapBinder
> <http://google.github.io/guice/api-docs/latest/javadoc/index.html?com/google/inject/multibindings/MapBinder.html>
> in this scenario. You'd inject the Map<String, Action> into your servlet
> and .get(request.getAction()).doAction();
>
> Fred
>
>
>
> On Tue, May 26, 2015 at 9:23 PM, Nate Bauernfeind <
> [email protected]> wrote:
>
>> Oh yeah, I forgot to mention, I love making my factories inner static
>> interfaces! It *really* helps keep relevant things together. Doing that
>> here is also a natural choice.
>>
>> On Wed, May 27, 2015 at 12:17 AM Nate Bauernfeind <
>> [email protected]> wrote:
>>
>>> I want to say yes, but I'm afraid that request.getAction() is returning
>>> a string. Is this true? What would you expect your factory to look like?
>>>
>>> If they're strings you might have to resort to something like this:
>>>
>>> interface ActionFactory {
>>>   public Action.ADD newAdd();
>>>   public Action.UPDATE newUpdate();
>>>   public Action.DELETE newDelete();
>>> }
>>>
>>> public abstract class Action {
>>>     public abstract double doAction();
>>>
>>>     public static class ADD extends Action {
>>>         @Override
>>>         public double doAction() { ... }
>>>     }
>>>
>>>     // ...
>>>
>>>     public static Action parse(String action, ActionFactory factory) {
>>>         switch(action) {
>>>           case "ADD":
>>>             return factory.newAdd();
>>>            ...
>>>         }
>>>     }
>>> }
>>>
>>> It's not too bad. If getAction() returns something that is typesafe then
>>> you can have multiple overloaded "create" methods in your factory and do
>>> without the Action.parse method. It also might make sense to use this
>>> pattern in addition to having an enum, and then parse the enum and pass the
>>> enum into Action.parse instead of the String.
>>>
>>>
>>> On Tue, May 26, 2015 at 11:54 PM klc <[email protected]> wrote:
>>>
>>>> I like the pattern concise and simple, in our service class:
>>>>
>>>> Action action = Action.parse(request.getAction());
>>>> action.doAction();
>>>>
>>>> If I migrate them to static inner class, would it be like this?
>>>>
>>>> Action action = ActionFactory.create(request.getAction()));
>>>> action.doAction();
>>>>
>>>> klc
>>>>
>>>> On Tuesday, May 26, 2015 at 11:54:56 PM UTC+8, Nate Bauernfeind wrote:
>>>>
>>>>> What is it that you like about the pattern that you want to keep? Are
>>>>> you looking for static inner classes? You can couple the pattern with an
>>>>> assisted inject factory, or providers depending on your use case.
>>>>>
>>>>> public abstract class Action {
>>>>>     public abstract double doAction();
>>>>>
>>>>>     public static class ADD extends Action {
>>>>>         @Override
>>>>>         public double doAction() { ... }
>>>>>     }
>>>>>
>>>>>     public static class UPDATE extends Action {
>>>>>         @Override
>>>>>         public double doAction() { ... }
>>>>>     }
>>>>>
>>>>>     public static class DELETE extends Action {
>>>>>         @Override
>>>>>         public double doAction() { ... }
>>>>>     }
>>>>> }
>>>>>
>>>>> Nate
>>>>>
>>>>> On Tue, May 26, 2015 at 7:06 AM klc <[email protected]> wrote:
>>>>>
>>>> Hi guys, thanks for all the reply before I have migrate my servlet
>>>>>> application to guice, partly at least.
>>>>>>
>>>>>> I have a question about design, we use the enum template pattern a
>>>>>> lot, like this:
>>>>>>
>>>>>> public enum Action {
>>>>>>   ADD {
>>>>>>     @Override
>>>>>>     public double doAction() {...}
>>>>>>   },
>>>>>>   UPDATE {
>>>>>>     @Override
>>>>>>     public double doAction() {...}
>>>>>>   },
>>>>>>   DELETE{
>>>>>>     @Override
>>>>>>     public double doAction() {...}
>>>>>>
>>>>>>   public abstract double doAction();
>>>>>>
>>>>>> }
>>>>>>
>>>>>> This is great pattern and I have nothing against it, but you can't
>>>>>> inject it into other class and can't inject anything into it.
>>>>>> Is there a similar way to do the same, but injectable?
>>>>>>
>>>>>> --
>>>>>> 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 [email protected].
>>>>>> To post to this group, send email to [email protected].
>>>>>
>>>>>
>>>>>> 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/3f1c0641-b8c1-4391-aab7-81e8e05608d8%40googlegroups.com
>>>>>> .
>>>>>> 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 [email protected].
>>>> To post to this group, send email to [email protected].
>>>> 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/a9aac798-6830-444e-b7b3-b9dd5744bbb2%40googlegroups.com
>>>> <https://groups.google.com/d/msgid/google-guice/a9aac798-6830-444e-b7b3-b9dd5744bbb2%40googlegroups.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 [email protected].
>> To post to this group, send email to [email protected].
>> 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/CAHNex98jrAo6ibvQhc8T9N%3DixnuV6j5BfH-Pjzy5VsyFFHUM7Q%40mail.gmail.com
>> <https://groups.google.com/d/msgid/google-guice/CAHNex98jrAo6ibvQhc8T9N%3DixnuV6j5BfH-Pjzy5VsyFFHUM7Q%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 [email protected].
> To post to this group, send email to [email protected].
> 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/CAKCukAJc7RyCjJOyKakHGWGR8Y%3DgBAZVAfwV3c3LyLO-i79nsg%40mail.gmail.com
> <https://groups.google.com/d/msgid/google-guice/CAKCukAJc7RyCjJOyKakHGWGR8Y%3DgBAZVAfwV3c3LyLO-i79nsg%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 [email protected].
To post to this group, send email to [email protected].
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/CAHNex99kRBTaaym-_iPOq%3DY10q8g4sRWykHbQBiBrvb5jZdm%3DQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to