Je veux concevoir une API qui lit un fichier texte volumineux, extrait les informations pertinentes et retourne une liste des Foo objets comme celui-ci:architecture de services Java
interface FooService {
Optional<Foo> getFoo(Bar bar);
}
Le format du fichier texte et la façon dont il est analysé est toujours le même. La seule chose qui peut varier est l'emplacement du fichier, c'est-à-dire qu'il peut s'agir d'un fichier sur le système local ou d'une URL. J'ai donc créé un 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));
}
}
implémentations concrètes prendriez simplement appeler le super constructeur avec un 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);
}
}
}
Est-ce une conception API sonore ou est-il un moyen « mieux » pour atteindre mon objectif ? C'est à dire. est-il intelligent d'appeler le super constructeur avec un InputStream ou serait-il préférable d'avoir une méthode séparée load()
qui ouvre le flux en cas de besoin?
Pour le code de travail, veuillez passer à codereview.stackexchange.com – GhostCat
Faire un travail dans un constructeur est généralement une mauvaise idée. Il est difficile de tester le code et peut entraîner un comportement non évident dans les hiérarchies d'héritage. – sisyphus