我想设计读取一个大的文本文件中的API,提取相关信息,并返回美孚对象的列表如下:Java服务架构
interface FooService {
Optional<Foo> getFoo(Bar bar);
}
文本文件和方式,它的格式被解析总是一样的。唯一可以变化的是文件的位置,即它可以是本地系统上的文件或URL。所以,我创建了一个AbstractFooService:
class AbstractFooService implements FooService {
Map<Bar, Foo> registry;
AbstractFooService(InputStream is) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(is))) {
registry = reader.lines()
.map(l -> l.split(';'))
.map(a -> new Foo(a[0]), a[1]))
.collect(Collectors.groupingBy(...));
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
Optional<Foo> getFoo(Bar bar) {
return Optional.ofNullable(registry.get(bar));
}
}
具体的实现只是调用超级构造与一个InputStream:
class UrlFooService extends AbstractFooService {
UrlFooService(String url) {
super(createStream(url));
}
private static InputStream createStream(final String url) {
try {
return new URL(string).openStream();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}
那是一个完善的API设计或者是有一个“好”的方式来实现我的目标?即使用InputStream调用超级构造函数是否明智?或者需要一个单独的load()
方法来在需要时打开数据流?
有关工作代码,请转到codereview.stackexchange.com – GhostCat
在构造函数中执行工作通常是一个糟糕的主意。它使得难以测试代码,并可能导致继承层次结构中的非显而易见的行为。 – sisyphus