【问题标题】:Change an object's implemented interfaces at runtime在运行时更改对象的实现接口
【发布时间】:2015-03-03 09:07:18
【问题描述】:

是否可以动态添加到对象实现的接口列表中(这样instanceof 返回 true 并且强制转换不会失败)?

我有一组对象,它们的类型需要在运行时动态更改。随着它们状态的变化,它们的更多方法/属性变得有效。目前,这是以“蛮力”方式完成的……所有成员都暴露出来,在错误的时间调用错误的成员是一个错误。理想情况下,我想使用静态类型,并将这些对象传递给需要特定接口的方法。对象实现的接口集只会增加,因此旧的引用仍然有效。

是否可以在运行时更改对象的已实现接口,无论是使用内置反射还是通过第三方字节码操作?

【问题讨论】:

  • 我不是 100% 确定你到底想做什么,请详细说明。无论哪种方式,使用反射或instanceof 都是代码异味,表明您的代码需要进行一些重构。可能有一种设计模式可以满足您的需求。
  • 静态类型意味着编译时强制执行,这与您希望在运行时更改类型的愿望不一致。
  • @amit,“代码异味”可能表示也可能不表示解决方案不佳(否则将是语法错误)。使用instanceof 在运行时推断对象的类型是有正当理由的。
  • @OliverCharlesworth 不是。我希望方法采用特定的接口,但调用者应该能够传入我的动态对象,只要该对象处于可以实现该接口的状态。
  • @AleksandrDubinsky 重点是 - 如果我们实际上不了解您要做什么,则很难提出建议。

标签: java types dynamic-typing


【解决方案1】:

您可以使用Proxy,但正如 cmets 所建议的 - 这几乎总是不是最佳选择。

你最好把你的对象制作成多面的。

interface Interface1 {

    String getI1();
}

interface Interface2 {

    String getI2();
}

class Multifaceted {

    String i1;
    String i2;

    private final Interface1 asInterface1 = new Interface1() {

        @Override
        public String getI1() {
            return i1;
        }

    };

    private final Interface2 asInterface2 = new Interface2() {

        @Override
        public String getI2() {
            return i2;
        }

    };

    public Interface1 asInterface1() {
        if ( i1 == null ) {
            throw new InvalidStateException("I am not ready to be one of these yet!");
        }
        return asInterface1;
    }

    public Interface2 asInterface2() {
        return asInterface2;
    }

}

【讨论】:

    猜你喜欢
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 2013-10-08
    • 1970-01-01
    • 2015-01-15
    相关资源
    最近更新 更多