【发布时间】:2018-08-10 04:39:32
【问题描述】:
一直在迁移一些遗留代码,我遇到了这个。
@Getter
@Setter
public class CollectedData
{
SkillResponse skills;
TrendingResponse storyMatch;
Map<String, String> slotData;
Map<String, String> slotDataSecondSource;
Boolean hasSlots;
Boolean hasSlotsSecondSource;
KnowledgeRequest request;
}
由于我一直在使用 java 8 并且习惯了流,我开始将这个响应类重构为 ..
@Getter
@Setter
public class CollectedData
{
List<DataSupplierResponse> dataSupplierResponses;
Metadata metadata;
}
DataSupplierResponse 应该是这样定义的接口。
public interface DataSupplierResponse<T>
{
DataSupplierType getDataSupplierType();
T getSupplierResponse();
}
实现示例:
public class DataSupplierResponseImpl implements DataSupplierResponse<TrendingResponse>
{
private TrendingResponse mTrendingResponse;
public DataSupplierResponseImpl(
TrendingResponse trendingResponse)
{
mTrendingResponse = trendingResponse;
}
@Override
public DataSupplierType getDataSupplierType()
{
return DataSupplierType.TRENDING_STORY;
}
@Override
public TrendingResponse getSupplierResponse()
{
return mTrendingResponse;
}
}
目标是根据CollectedData 运行某些谓词。
Optional<DataSupplierResponse> first = data.getDataSupplierResponses().stream()
.filter(res -> res.getDataSupplierType().equals(DataSupplierType.TRENDING_STORY))
.findFirst();
这需要强制转换才能获得正确的对象。它返回对象
TrendingResponse match = first.get().getSupplierResponse();
因此,当我开始重构时,我假设通过创建返回不同数据的通用接口来解决数据可用的问题。为了使这段代码正常工作,我必须强制转换 getSupplierResponse 的返回对象,这违背了使用泛型的目的。为了我自己,我需要使这个 Data Carrier 对象尽可能的干净和美观。任何想法我应该如何构建这些类,和/或如何使用泛型来解决这个问题。
编辑:我知道 StackOverflow 社区喜欢强制执行客观、具体的答案,但还有其他地方可以解决设计问题吗?
【问题讨论】:
-
你能编辑像
SkillResponse这样的类吗?
标签: java generics interface architecture java-8