【问题标题】:How to return list of implementations?如何返回实现列表?
【发布时间】:2020-05-04 10:55:05
【问题描述】:

我正在创建一个应用程序,用于在各个商店下订单。每个商店都有不同的下订单方式。目前它看起来像这样:

@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
}

当客户创建订单时,他应该能够选择要在哪个商店下订单。

如何获取可用商店列表?或者也许我应该以不同的方式实现这样的逻辑?

【问题讨论】:

    标签: java spring domain-driven-design


    【解决方案1】:

    我非常不方便的方法如下:

    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, 
    

    我可能错了:但据我所知,超类不知道它被扩展了。

    【讨论】:

    • 所以基本上更方便的方法是将这些实现列表放在某个地方?我的意思是一些属性文件或数据库。
    • 也许 Class.forName(String) 方法对你来说是一个选择。这样,您就可以通过选择 Shop(例如 XYZ)和后缀 Shop。这仍然不是列表,但可能已经为您的用例提供了足够的功能。就个人而言,我可能会使用接口并通过 switch case 或 Class.forName(String) 选择实现类型。
    猜你喜欢
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2018-11-05
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    相关资源
    最近更新 更多