我想設計讀取一個大的文本文件中的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