簡體   English   中英

使用Java泛型和工廠模式的返回類型的最佳實踐是什么

[英]What Is Best Practice for Return Types using Java Generics and Factory Pattern

我試圖第一次學習使用泛型,這是一種相當復雜的方法。 我還在使用Jackson 2進行反序列化。

我每次都在我的退貨聲明中進行強制轉換。 有人可以告訴我這是否錯嗎? 如果是這樣,有什么更好的方法呢?

這是一個演示這種情況的簡單示例類:

class ResourceFactory <T extends Resource>{

    List<T> getResources(String path)
    {
        ResourcesResponse rgRes = new ObjectMapper()
        .readValue(response.body().byteStream(), ResourcesResponse.class)

        return (List<T>)rgRes.resources
    }
}

更新:
根據評論,這里是其他類主體外觀的超級簡化示例。

class ResourceResponse {
    List<Resource> resources
}

class ResourceGeneric extends Resource {
}

class ResourceTypeOne extends Resource {
    public String typeOneOnlyProperty
}

class ResourceTypeTwo extends Resource {
    public String typeTwoOnlyProperty
}

如果使用正確,Jackson可以支持通用類型。 這是我的處理方式:

class ResourcesResponse<T extends Resource> {
    List<T> resources;
}

class ResourceFactory<T extends Resource> {
    // Either of these should work; pick your constructor
    private JavaType responseType;
    private TypeReference<ResourcesResponse<T>> responseType;

    // Option A
    // Involves some boilerplate, but keeps the constructor simple
    // Use: new ResourceFactory<ResourceTypeOne>(ResourceTypeOne.class)
    ResourceFactory(Class<T> resourceType) {
        this.responseType = TypeFactory.defaultInstance()
               .constructParametricType(ResourcesResponse.class, resourceType);
    }

    // Option B
    // Cleaner internally, but exposes implementation details
    // Use: new ResourceFactory<ResourceTypeOne>(new TypeReference<ResourcesResponse<ResourceTypeOne>>() {})
    ResourceFactory(TypeReference<ResourcesResponse<T>> responseType) {
        this.responseType = responseType;
    }

    List<T> getResources(String path)
    {
        ResourcesResponse<T> rgRes = new ObjectMapper()
        .readValue(response.body().byteStream(), responseType);

        return rgRes.resources;
    }
}

由於類型擦除,快速失敗的技術是傳遞Resource子類:

public <T extends Resource> List<T> getResources(Class<T> resourceType, String path)
{
    ResourcesResponse rgRes = new ObjectMapper()
    .readValue(response.body().byteStream(), ResourcesResponse.class)

    return Collections.checkedList(rgRes.resources, resourceType);
}

這樣可以確保使用代碼所具有的這種不安全的轉換,不會添加其他類的值。

這不會“檢查”原始列表

rgRes.resources.forEach(res -> resourceType.cast(res))

這不是一個簡單的演員表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM