Sie können dies nicht direkt in einer Klasse tun, da die folgende Klassendefinition aufgrund des Löschens generischer Typen und der doppelten Schnittstellendeklaration nicht kompiliert werden kann.
class TwoTypesConsumer implements Consumer<Apple>, Consumer<Tomato> {
// cannot compile
...
}
Für jede andere Lösung zum Packen derselben Verbrauchsoperationen in eine Klasse muss Ihre Klasse wie folgt definiert werden:
class TwoTypesConsumer { ... }
Dies ist sinnlos, da Sie die Definition beider Vorgänge wiederholen / duplizieren müssen und sie nicht über die Schnittstelle referenziert werden. IMHO ist dies eine schlechte kleine und Code-Duplizierung, die ich zu vermeiden versuche.
Dies kann auch ein Indikator dafür sein, dass eine Klasse zu viel Verantwortung trägt, um zwei verschiedene Objekte zu verbrauchen (wenn sie nicht gekoppelt sind).
Was ich jedoch tue und was Sie tun können, ist, ein explizites Factory-Objekt hinzuzufügen, um verbundene Verbraucher auf folgende Weise zu erstellen:
interface ConsumerFactory {
Consumer<Apple> createAppleConsumer();
Consumer<Tomato> createTomatoConsumer();
}
Wenn diese Typen in Wirklichkeit wirklich gekoppelt (verwandt) sind, würde ich empfehlen, eine Implementierung folgendermaßen zu erstellen:
class TwoTypesConsumerFactory {
// shared objects goes here
private class TomatoConsumer implements Consumer<Tomato> {
public void consume(Tomato tomato) {
// you can access shared objects here
}
}
private class AppleConsumer implements Consumer<Apple> {
public void consume(Apple apple) {
// you can access shared objects here
}
}
// It is really important to return generic Consumer<Apple> here
// instead of AppleConsumer. The classes should be rather private.
public Consumer<Apple> createAppleConsumer() {
return new AppleConsumer();
}
// ...and the same here
public Consumer<Tomato> createTomatoConsumer() {
return new TomatoConsumer();
}
}
Der Vorteil ist, dass die Factory-Klasse beide Implementierungen kennt, es einen gemeinsamen Status gibt (falls erforderlich) und Sie bei Bedarf mehr gekoppelte Verbraucher zurückgeben können. Es gibt keine wiederholte Deklaration der Verbrauchsmethode, die nicht von der Schnittstelle abgeleitet ist.
Bitte beachten Sie, dass jeder Verbraucher eine unabhängige (noch private) Klasse sein kann, wenn er nicht vollständig verwandt ist.
Der Nachteil dieser Lösung ist eine höhere Komplexität der Klasse (auch wenn es sich um eine Java-Datei handeln kann). Um auf die Konsummethode zuzugreifen, benötigen Sie einen weiteren Aufruf, anstatt:
twoTypesConsumer.consume(apple)
twoTypesConsumer.consume(tomato)
du hast:
twoTypesConsumerFactory.createAppleConsumer().consume(apple);
twoTypesConsumerFactory.createTomatoConsumer().consume(tomato);
Zusammenfassend kann man definieren 2 allgemeine Verbraucher in einer Top-Level - Klasse 2 innere Klassen verwenden , aber bei Aufruf müssen Sie zunächst einen Verweis erhalten auf geeignete Umsetzung der Verbraucher , da dies nicht nur ein Verbraucher Objekt sein kann.