我目前正在致力於一個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代碼。編譯器如何知道要包含哪些類,並且是否有強制類添加的方法?多態性是否會延續到客戶端或僅支持服務器端?
我確實考慮過創建虛擬調用來強制添加這些類,但是這只是尖叫不好的做法,並決定反對它。我確實改變了原來的調用,只返回Cat對象來測試它是否會添加哺乳動物和動物類。我發現編譯器生成的類根本不包含多態性。生成的Cat類擴展了GenericJson類,這讓我認爲這個集合不會返回我所希望的混合對象。我已將切換到UI,但當我測試原始呼叫時,我將分享我的結果。 – coolhanddan
我採取的方法如下:在前端有一個接口來表示您的數據,例如Animal,以及一個具體的Impl AnimalImpl,您可以從後端端點json類生成該接口。你的動物可以形成一個界面層次和各自的impls。我也非常喜歡這個,因爲json廢話是可變的,而你可以讓你的前端實現不可變,並保留任何額外的行爲和數據。總的來說,json的東西對前端架構恕我直言不夠健壯。祝你好運,並有興趣看看你發現了什麼! – Creos