选择在运行时实现的接口

时间:2017-05-10 19:53:36

标签: java interface

我想知道,在Java中,是否有一种方法可以从实现多个接口的类创建对象,但是在运行时选择应该实现哪些接口。这些接口没有方法,这是通过在运行时定义哪些属性应该具有来创建对象的方法。这是我真正的问题。 使用案例:我有一个具有大量属性的类,但是从这个类创建的对象只使用其中的一些属性,有些属性在对象之间是共同的,有些属性应该由用户在运行时决定。我想避免创建具有大量空属性的对象。

1 个答案:

答案 0 :(得分:1)

也许一个Proxy类可能很有趣。

我会考虑测试功能/功能:

interface Flying { void fly(); }
interface Swimming { void swim(); }

Animal animal = ...

Optional<Flying> flying = animal.lookup(Flying.class);
flying.ifPresent(f -> f.fly());    interface Flying { void fly(); }


Optional<Swimming> swimming = animal.lookup(Swimming.class);
swimming.ifPresent(sw -> sw.swim());

Animal不需要实现任何界面,但您可以查找(lookupas)功能。这在未来是可扩展的,动态的:可以在运行时更改。

实施

private Map<Class<?>, ?> map = new HashMap<>();

public <T> Optional<T> lookup(Class<T> type) {
     Object instance = map.get(type);
     if (instance == null) {
         return Optional.empty();
     }
     return Optional.of(type.cast(instance));
}

<S> void register(Class<S> type, S instance) {
    map.put(type, instance);
}

该实现执行安全的动态转换,因为寄存器确保安全填充(键,值)条目。