Вопрос по java – Места, которые имеют все, кроме префикса или как использовать PlaceHistoryMapperWithFactory

0

В моем gwt-приложении у меня есть несколько мест, в которых есть все, кроме префикса (например, «editUserPlace» и «showUserPlace» - в этом случае состояние определяется userId) Моя текущая попытка состоит в том, чтобы расширить реферат "UserPlace" по & quot; ShowUserPlace & quot; и & quot; EditUserPlace & quot; они отличаются только одной строкой: @Prefix (& quot; showUser & quot;) / @Prefix (& quot; editUser & quot;) - код токенайзера дырки должен быть скопирован (я не могу наследовать код токенизатора, но переопределить префикс).

вhttps://groups.google.com/d/topic/google-web-toolkit/pghMLX27Y4Y/discussion Томас предложил использовать & quot; PlaceHistoryMapperWithFactory & quot; но я застрял с этим.

Нужно ли предоставлять метод для каждого места / токенизатора (также для мест, которые являются "нормальными" - предоставление своих собственных токенизаторов)? Должен ли я рекламировать свои абстрактные и / или расширяющие классы в @WithTokenizer? Как / где я должен вызвать setFactory?

Кто-нибудь использовал PlaceHistoryMapperWithFactory (возможно, в аналогичном случае использования)? И дать какой-нибудь совет? Кто-нибудь сталкивался с такой же проблемой и решил ее по-другому?

Ваш Ответ

2   ответа
0

Хорошо, я возился с универсальным токенизатором (& quot; UserPlaceTokenizer & quot;), но сдался: проблема в том, что Фабрике нужны токенизаторы для конкретного класса, поэтому сначала я попытался создать универсальный токенизатор:

    public static class  Tokenizer<T extends UserPlace> implements PlaceTokenizer<T> {

    @Override
    public final T getPlace(final String token) {
        return (T) new UserPlace(token); //BAD
    }

    @Override
    public final String getToken(final T place) {
        return place.getToken();
    }
}

Проблема - приведение UserPlace к (T) - это не сработает (UserPlace не может быть приведено к конкретному подклассу). Поэтому мне нужно & quot; вернуть новый ShowUserPlace (...) & quot; где-то, чтобы получить этот экземпляр, чтобы удовлетворить интерфейс токенизатора. Чтобы сделать длинную историю не слишком длинной: я вернулся к своему предыдущему решению: расширяющиеся классы копируют суперкласс & apos; конструктор и предоставляет отдельные токенизаторы, которые просто вызывают свой собственный конструктор (который вызывает супер-конструктор):

public class ShowUserPlace extends UserPlace {

public ShowUserPlace(String token) {
    super(token);
}

@Prefix(value = "showUser")
public static class Tokenizer implements PlaceTokenizer<ShowUserPlace> {

    @Override
    public final ShowUserPlace getPlace(final String token) {
        return new ShowUserPlace(token);
    }

    @Override
    public final String getToken(final ShowUserPlace place) {
        return place.getToken();
    }
}
}

Временным решением был абстрактный токенизатор, который предоставляет интерфейс & apos; методы. getPlace вызовет абстрактный метод (который возвращает T), а конкретная реализация вызовет конкретный конструктор (который также вызывает только супер-конструктор). В конце у этого решения будет примерно столько же строк и скопированного кода, что и у решения выше: - |.

У меня все еще есть плохое предчувствие по этому поводу - вероятно, это все еще решение с помощью & quot; .. WithFactory & quot; или совершенно другой способ решения этой проблемы.

1

class MyFactory {
   @Prefix("showUser")
   public PlaceTokenizer<ShowUserPlace> showUserPlace() {
      return new UserPlaceTokenizer<ShowUserPlace>() {
         protected ShowUserPlace createPlace(String id) {
            return new ShowUserPlace(id);
         }
      };
   }

   @Prefix("showUser")
   public PlaceTokenizer<EditUserPlace> showUserPlace() {
      return new UserPlaceTokenizer<EditUserPlace>() {
         protected EditUserPlace createPlace(String id) {
            return new EditUserPlace(id);
         }
      };
   }
}

abstract class UserPlaceTokenizer<P extends UserPlace> implements PlaceTokenizer<P> {
   public P getPlace(String token) {
      // shared logic between both places: parses ID (or whatever) from token
      return createPlace(id);
   }
   public String getToken(P place) {
      // shared logic between both places: build token out of place
      return token;
   }
   protected abstract P createPlace(String id);
}

Конечно, вы могли бы также ввести какой-тоProvider<P> в токенизаторе вместо того, чтобы переклассифицировать его, чтобы переопределить егоcreatePlace метод.

Вы можете использовать его вместе с@WithTokenizersГенератор захлебнется, если найдет два токенизатора для одного и того же места или префикса.

Вам следует позвонитьsetFactory сразу после тебяGWT.create() ваш маппер (на самом деле, важно то, что вы устанавливаете фабрику перед любым вызовом маппера)getPlace или жеgetToken методы).

Error: User Rate Limit Exceeded dermoritz
Error: User Rate Limit Exceeded dermoritz
Error: User Rate Limit Exceeded dermoritz
Error: User Rate Limit Exceededgroups.google.com/forum/?fromgroups#!topic/google-web-toolkit/… dermoritz
Error: User Rate Limit ExceededgetPlaceError: User Rate Limit ExceededGWT.create()+setFactoryError: User Rate Limit ExceededsetFactoryError: User Rate Limit Exceeded@InjectError: User Rate Limit ExceededGWT.create()Error: User Rate Limit Exceeded

Похожие вопросы