Как вернуть список реализаций? - PullRequest
0 голосов
/ 04 мая 2020

Я создаю приложение, которое будет использоваться для размещения заказов в различных магазинах. В каждом магазине есть свой способ оформления заказа. В настоящее время это выглядит так:

@Document("order")
public class Order extends AbstractAggregateRoot<Order> {
    private UUID id;
    private Shop shop;
    private Product product;
    // other fields and methods have been skipped
}
public abstract class Shop {
    private String baseUrl;
    abstract void placeOrder(...);
    // other fields and methods have been skipped
}

public class XYZShop extends Shop {
    @Override
    void placeOrder(...) {
        // implementation of method
    }
    // other fields and methods have been skipped
}

Когда клиент создает заказ, он должен иметь возможность выбрать, в каком магазине он хочет разместить этот заказ.

Как получить список доступных магазинов? Или, может быть, я должен реализовать такие логи c по-другому?

1 Ответ

1 голос
/ 04 мая 2020

Мне очень неудобным способом будет следующий:

public Test3()
{
    Class<?> parentClass = this.getClass().getSuperclass();
    if(Extenders.extendingClasses.containsKey(parentClass.getCanonicalName()))
    {
        Extenders.extendingClasses.get(parentClass.getCanonicalName()).add(this.getClass());
    }
    else
    {
        List<Class<?>> extenders = new ArrayList<>();
        extenders.add(this.getClass());
        Extenders.extendingClasses.put(parentClass.getCanonicalName(), extenders);
    }

}

public static void main(String[] args)
{

    Test3 tmp = new Test3();

    for(Entry<String,List<Class<?>>> entry : Extenders.extendingClasses.entrySet())
    {

        System.out.println("Class "+entry.getKey()+" is extended by: ");

        for(Class<?> clazz : entry.getValue())
        {
            System.out.print(clazz.getCanonicalName()+", ");
        }

    }

}

с суперклассом

public abstract class Test2 {

}

и синглтоном

public class Extenders {


    public static Map<String,List<Class<?>>> extendingClasses = new TreeMap<>();

}

Этот метод Однако есть проблема, что вам нужно сначала создать экземпляр расширяющего класса. Так что это в основном не список всех экстендеров, а только тех, кто привык.

Вывод в этом случае будет:

Class Test2 is extended by: 
Test3, 

Я могу ошибаться: но, насколько я знаю, суперкласс не знает о его расширении.

...