2012-04-10 98 views
0

在我的gwt-app中,我有一些共享所有除前綴之外的地方(如「editUserPlace」和「showUserPlace」 - 狀態由userId決定) 我目前的嘗試是通過「ShowUserPlace」和「EditUserPlace」擴展一個抽象的「UserPlace」,它們只有一行不同:@Prefix(「showUser」)/ @Prefix(「editUser」) - 洞標記器代碼必須被複制我不能繼承令牌處理器的代碼,但覆蓋前綴)。共享所有除前綴或使用方法的地方PlaceHistoryMapperWithFactory

in https://groups.google.com/d/topic/google-web-toolkit/pghMLX27Y4Y/discussion托馬斯建議使用「PlaceHistoryMapperWithFactory」,但我堅持下去。

我必須爲每個地方/標記器(也適用於「正常」的地方 - 提供自己的標記器)提供方法嗎? 我是否必須將我的Abstract和/或擴展類廣告到@WithTokenizer? 如何/我應該在哪裏調用setFactory?

有沒有人使用過PlaceHistoryMapperWithFactory(可能是類似的用例)?並提供一些建議? 有人遇到同樣的問題,並以另一種方式解決它嗎?

回答

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方法之前設置的工廠)。

+0

thx澄清托馬斯。由於我使用杜松子酒怎麼/在哪裏調用setFactory?可能onModuleLoad(它是「private final ClientInjector injector = GWT.create(ClientInjector.class);」)之後? 你可能做了一些複製粘貼失敗?我想前綴和方法名稱應該是不同的?! – dermoritz 2012-04-11 07:06:11

+0

我有點問題:如何實現UserPlaceTokenizer?它是否應該實現這兩種(PlaceTokenizer 和... )或者它是通用的? - PlaceTokenizer <?擴展UserPlace>不工作。 – dermoritz 2012-04-11 07:26:11

+0

已更新的答案(您必須爲'getPlace'提供特定於地點的代碼,就像您自己想象的那樣)。至於GIN,您可以在提供者(或提供者方法)中自己執行'GWT.create()'+'setFactory';或者簡單地在你的映射器接口中重寫'setFactory'並用'@Inject'註釋它(GIN應該在它的'GWT.create()'接口之後調用它)。 – 2012-04-11 12:34:29

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不能轉換爲具體的子類)。所以我需要一個「返回新的ShowUserPlace(...)」某處來獲得這個實例,以滿足tokenizer接口。爲了使長話不會太長:我回到我以前的解決方案:擴展類正在複製超類的構造函數,並提供了簡單地調用它們自己的構造函數(即調用超級構造函數)的單獨的Tokenizers:

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」或完全不同的方式來面對這種用例的解決方案。

相關問題