常に同じです。変更できる唯一のものは、ファイルの場所です。つまり、ローカルシステム上のファイルまたはURLである可能性があります。Javaサービス・アーキテクチャ
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とスーパーのコンストラクタを呼び出します:だから私はAbstractFooServiceを作成し
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