Обобщение Java для политики как альтернатива передаче политики в конструкторе - PullRequest
1 голос
/ 01 апреля 2009

У меня есть код Java, похожий на:

public class Thing {

    private IPolicy policy;

    public Thing(IPolicy policy) {
            this.policy = policy;
    }

    public void doSomething() {
            this.policy.execute();
    }   
}

Мой вопрос: возможно ли сделать это с помощью дженериков, а не передавать политику конструктору? Я думаю, это означает, что я хочу, чтобы это закончилось как

public class Thing<T extends IPolicy>

но я не настолько хорош в генериках.

Мои мотивы: 1) для меня было бы более логично, если бы моя программа была частью типа и не была связана с конструктором (у которого есть другие более важные вещи), и 2) я пытаясь выучить дженерики.

Ответы [ 3 ]

3 голосов
/ 01 апреля 2009

Я не думаю, что это имеет большой смысл. Разве вы не зависите от самой политики, а не от типа политики? Вы не хотите задавать вопросы политики (например, разрешено ли действие)? Это означает, что вам понадобится экземпляр политики - а это значит, что имеет смысл передать его в конструктор.

Обобщения подходят, когда вы хотите строго типизированный API, где часть API зависит от другого типа, но самой реализации не важно, что это за тип (возможно, с некоторыми ограничениями). API коллекций, вероятно, является каноническим примером - List<T> не волнует, что такое T, но хочет представить строго типизированный API в терминах T . Я не вижу, чтобы это соответствовало вашему примеру с политикой.

0 голосов
/ 01 апреля 2009

Даже универсальная версия не избежит «передачи политики конструктору», потому что в универсальных Java-программах используется стирание типа . Однако вы можете реализовать конструктор GenericThing(Class<T> clazz), но это overkill :

public class GenericThing<T extends IPolicy> {

    private T policy;

    public GenericThing(Class<T> clazz) throws InstantiationException, IllegalAccessException {
        policy = clazz.newInstance();
    }

    public GenericThing(T policy) {
        this.policy = policy;
    }

    public void doSomething() {
        this.policy.execute();
    }
}

Я очень согласен с ответом Джона . Вы на самом деле не пользуетесь этим, будучи строго типизированным .

0 голосов
/ 01 апреля 2009

То, что вы пытаетесь сделать, это убедиться, что у Вещи всегда есть политика, т.е. Вещи не могут существовать с политикой. Для этого требуется только конструкторский механизм или абстракция типа

public abstract class Thing {
   public abstract Policy getPolicy();
   public void doSomething() {
       getPolicy().execute();
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...