Genel sınıfların silinmesi ve yinelenen arabirim bildirimi nedeniyle aşağıdaki sınıf tanımı derlenemediğinden bunu doğrudan bir sınıfta yapamazsınız.
class TwoTypesConsumer implements Consumer<Apple>, Consumer<Tomato> {
// cannot compile
...
}
Aynı tüketme işlemlerini bir sınıfta paketlemek için başka herhangi bir çözüm, sınıfınızı şu şekilde tanımlamayı gerektirir:
class TwoTypesConsumer { ... }
her iki işlemin tanımını tekrarlamanız / çoğaltmanız gerektiğinden anlamsızdır ve arabirimden referans alınmaz. Bunu yaparken IMHO kaçınmaya çalışıyorum kötü bir küçük ve kod çoğaltma.
Bu aynı zamanda bir sınıfta 2 farklı nesneyi tüketmek için çok fazla sorumluluk bulunduğunun bir göstergesi olabilir (eşleşmemişlerse).
Ancak yaptığım ve yapabileceğiniz şey, bağlı tüketicileri aşağıdaki şekilde oluşturmak için açık fabrika nesnesi eklemektir:
interface ConsumerFactory {
Consumer<Apple> createAppleConsumer();
Consumer<Tomato> createTomatoConsumer();
}
Eğer gerçekte bu tipler gerçekten bağlıysa (ilgili) o zaman böyle bir uygulama yaratmanızı tavsiye ederim:
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();
}
}
Avantajı, fabrika sınıfının her iki uygulamayı da bilmesidir, paylaşılan bir durum vardır (gerekirse) ve gerekirse daha fazla bağlı tüketici iade edebilirsiniz. Arabirimden türetilmeyen yinelenen bir tüketme yöntemi bildirimi yoktur.
Tamamen ilgili değilse, her bir tüketicinin bağımsız (hala özel) sınıf olabileceğini lütfen unutmayın.
Bu çözümün dezavantajı daha yüksek bir sınıf karmaşıklığıdır (bu bir java dosyası olsa bile) ve tüketme yöntemine erişmek için aşağıdakiler yerine bir çağrı daha yapmanız gerekir:
twoTypesConsumer.consume(apple)
twoTypesConsumer.consume(tomato)
var:
twoTypesConsumerFactory.createAppleConsumer().consume(apple);
twoTypesConsumerFactory.createTomatoConsumer().consume(tomato);
Özetlemek gerekirse, 2 iç sınıf kullanarak bir üst düzey sınıfta 2 genel tüketici tanımlayabilirsiniz, ancak arama durumunda ilk olarak uygun uygulayıcı tüketiciye bir referans almanız gerekir, çünkü bu sadece bir tüketici nesnesi olamaz.