Hej!
Czy jest jakaś możliwość stworzyć pewną grupę klas implementujących dany interfejs, w której każda z tych klas zgłosi swoje istnienie do fabryki bez użycia zewnętrznych bibliotek i bloku static?
Mam sobie interfejs
public interface Order {
void execute();
}
i chciałbym, żeby każda klasa zgłosiła się do mojej fabryki
public class OrdersFactory {
private static HashMap<String, Class<? extends Order>> orders = new HashMap<>();
public static void register(String command, Class<? extends Order> orderClass) {
if (command == null || orders.containsKey(command))
throw new IllegalStateException("Command is null or already exists");
else if (orderClass == null)
throw new IllegalStateException("Class to be registered cannot be null");
orders.put(command, orderClass);
}
public static Order getOrderInstance(String command) {
if (!orders.containsKey(command))
return new InvalidOrder();
return createInstance(orders.get(command));
}
private static Order createInstance(Class<? extends Order> orderClass) {
try {
return orderClass.newInstance();
} catch (InstantiationException e) {
System.out.println("An error occurred while creating command class instance");
} catch (IllegalAccessException e) {}
return new InvalidOrder();
}
public static List<String> findPossibleValidCommands(String invalidCommand) {
return orders.keySet()
.stream()
.filter(command -> command.contains(invalidCommand))
.collect(Collectors.toList());
}
}
Przykładowo wygląda to tak
public class HelloOrder implements Order {
@Override
public void execute() {
System.out.println("Hello");
}
static {
OrdersFactory.register("hello", HelloOrder.class);
}
}
Ale moim zdaniem jest brzydkie, bo ciągle muszę robić CTRL + C
, CTRL + V
, a wtedy tracę smak życia.
Jakieś pomysły?