Ich habe einige Schnittstellen, die von Dritten in Zukunft implementiert werden sollen, und ich stelle selbst eine Basisimplementierung bereit. Ich werde nur ein paar verwenden, um das Beispiel zu zeigen.
Derzeit sind sie definiert als
Artikel:
public interface Item {
String getId();
String getName();
}
ItemStack:
public interface ItemStackFactory {
ItemStack createItemStack(Item item, int quantity);
}
ItemStackContainer:
public interface ItemStackContainer {
default void add(ItemStack stack) {
add(stack, 1);
}
void add(ItemStack stack, int quantity);
}
Jetzt, Item
und ItemStackFactory
ich kann absolut voraussehen, dass Dritte es in Zukunft erweitern müssen. ItemStackContainer
könnte auch in Zukunft erweitert werden, jedoch nicht auf eine Weise, die ich außerhalb meiner bereitgestellten Standardimplementierung vorhersehen kann.
Jetzt versuche ich, diese Bibliothek so robust wie möglich zu gestalten. Dies befindet sich noch im Anfangsstadium (Pre-Pre-Alpha), daher kann dies ein Akt des Over Engineering (YAGNI) sein. Ist dies ein geeigneter Ort, um Generika zu verwenden?
public interface ItemStack<T extends Item> {
T getItem();
int getQuantity();
}
Und
public interface ItemStackFactory<T extends ItemStack<I extends Item>> {
T createItemStack(I item, int quantity);
}
Ich befürchte, dass dies dazu führen könnte, dass Implementierungen und Verwendung schwieriger zu lesen und zu verstehen sind. Ich denke, es ist die Empfehlung, Generika nach Möglichkeit nicht zu verschachteln.