0

在我的 gwt-app 中,我有一些地方共享除前缀之外的所有内容(如“editUserPlace”和“showUserPlace” - 在这种情况下,状态由 userId 确定)我目前的尝试是通过“ShowUserPlace”扩展抽象“UserPlace”和“EditUserPlace”它们仅在一行中有所不同:@Prefix("showUser")/@Prefix("editUser") - 必须复制孔标记器代码(我不能继承标记器代码但会覆盖前缀)。

https://groups.google.com/d/topic/google-web-toolkit/pghMLX27Y4Y/discussion thomas 建议使用“PlaceHistoryMapperWithFactory”,但我坚持使用它。

我是否必须为每个地方/标记器提供一种方法(也适用于“正常”的地方 - 提供自己的标记器)?我是否必须将我的 Abstract 和/或扩展类添加到 @WithTokenizer?我应该如何/在哪里调用 setFactory?

有人用过 PlaceHistoryMapperWithFactory 吗(可能在类似的用例中)?并给点建议?有人遇到同样的问题并以另一种方式解决了吗?

4

2 回答 2

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()之前设置工厂)。getPlacegetToken

于 2012-04-10T15:59:53.880 回答
0

好的,我摆弄了一个通用标记器(“UserPlaceTokenizer”)但放弃了:问题是工厂需要一个具体类的标记器,所以首先我尝试制作一个通用标记器:

    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 不能转换为具体的子类)。所以我需要一个“return new ShowUserPlace(...)”来获取这个实例,以满足 tokenizer 接口。长话短说:我回到了我以前的解决方案:扩展类正在复制超类的构造函数并提供单独的标记器,它们只需调用它们自己的构造函数(调用超级构造函数):

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();
    }
}
}

一个临时解决方案是提供接口方法的抽象标记器。getPlace 将调用一个抽象方法(返回 T),具体实现将调用具体构造函数(也只调用超级构造函数)。最后,此解决方案将具有与上述解决方案大致相同的行数和复制代码:-|。

我对此仍然有一种不好的感觉-可能他们仍然是“..WithFactory”的解决方案,或者是面对这种用例的完全不同的方式。

于 2012-04-11T08:58:37.243 回答