2016-03-13 102 views
0

我目前正在致力於一個Android項目,該項目使用Google Datastore存儲數據,並且可以通過Cloud端點與Objectify庫進行訪問。對象化庫使用「@Subclass」註釋解釋多態性的工作很好,但是我遇到的問題是,當我生成用於Android代碼的客戶端庫時,不包括子類。有沒有辦法強制編譯器包含這些類?在生成的Google Cloud Endpoint客戶端庫中包含子類

這是我正在做的一個基本的例子。讓我們的多態性例如,從物化文檔:「ObjectifyService.factory()寄存器()。」

@Entity 
public class Animal { 
    @Id Long id; 
    String name; 
} 

@Subclass(index=true) 
public class Mammal extends Animal { 
    boolean longHair; 
} 

@Subclass(index=true) 
public class Cat extends Mammal { 
    boolean hypoallergenic; 
} 

值得一提的是,這些類的所有三個已經登記使用類上面我有我的API的方法,看起來與此類似:

@ApiMethod(
      name = "getAnimals", path = "zoo/getAnimals", httpMethod = ApiMethod.HttpMethod.GET 
) 
public Collection<Animal> getAnimals(final User user, @Named("IdList") Collection<Long> idList) 
     throws UnauthorizedException { 
    // If the user is not logged in, throw an UnauthorizedException 
    if (user == null) { 
     throw new UnauthorizedException("Authorization required"); 
    } 

    Map<Long,Animal> animalMap = ofy().load().type(Animal.class).ids(idList); 

    ArrayList<Animal> animals= new ArrayList<>(); 
    for (Long animalId:idList) { 
     animals.add(animalMap.get(animalId)); 
    } 
    return animals; 
} 

正如你可以看到最終的ArrayList「動物」可能含有動物,哺乳動物,或貓然而生成的庫只給我訪問到動物類。我需要確保子類可用於Android代碼。編譯器如何知道要包含哪些類,並且是否有強制類添加的方法?多態性是否會延續到客戶端或僅支持服務器端?

回答

0

這不是一個好的答案,但你可以公開一個無操作的API,它返回這些類型(實際上只是返回null;)。這應該迫使班級生成。如果有更正式的方式來做到這一點,請隨時糾正我。

+0

我確實考慮過創建虛擬調用來強制添加這些類,但是這只是尖叫不好的做法,並決定反對它。我確實改變了原來的調用,只返回Cat對象來測試它是否會添加哺乳動物和動物類。我發現編譯器生成的類根本不包含多態性。生成的Cat類擴展了GenericJson類,這讓我認爲這個集合不會返回我所希望的混合對象。我已將切換到UI,但當我測試原始呼叫時,我將分享我的結果。 – coolhanddan

+0

我採取的方法如下:在前端有一個接口來表示您的數據,例如Animal,以及一個具體的Impl AnimalImpl,您可以從後端端點json類生成該接口。你的動物可以形成一個界面層次和各自的impls。我也非常喜歡這個,因爲json廢話是可變的,而你可以讓你的前端實現不可變,並保留任何額外的行爲和數據。總的來說,json的東西對前端架構恕我直言不夠健壯。祝你好運,並有興趣看看你發現了什麼! – Creos

相關問題