Ho alcune interfacce che intendo implementare in futuro da terze parti e fornisco personalmente un'implementazione di base. Userò solo un paio per mostrare l'esempio.
Attualmente sono definiti come
Articolo:
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);
}
Ora, Item
e ItemStackFactory
posso assolutamente prevedere che alcune terze parti debbano estenderlo in futuro. ItemStackContainer
potrebbe anche essere esteso in futuro, ma non in modi che io possa prevedere, al di fuori della mia implementazione predefinita fornita.
Ora, sto cercando di rendere questa libreria il più solida possibile; questo è ancora nelle fasi iniziali (pre-pre-alpha), quindi questo può essere un atto di over engineering (YAGNI). È un posto appropriato per usare i generici?
public interface ItemStack<T extends Item> {
T getItem();
int getQuantity();
}
E
public interface ItemStackFactory<T extends ItemStack<I extends Item>> {
T createItemStack(I item, int quantity);
}
Temo che questo possa finire per rendere le implementazioni e l'utilizzo più difficili da leggere e capire; Penso che sia la raccomandazione di evitare l'annidamento dei farmaci generici laddove possibile.