避免instanceof - 不可修改的类

时间:2012-12-18 18:05:34

标签: java instanceof

假设我有两个类AB,使B extends A分别实现具有相同输入参数类型的方法getAgetB和相同的返回类型(但不同的名称)。在方法public static <T extends A> void print(T t)获取类型为AB的对象的输入时,如果对象的类型为getA或{{{}},我想调用A 1}}如果对象的类型为getB

如果我可以修改BA的代码,我会让他们实现提供B的接口I(在getValue()的实现中AB会调用getA()和getB()resp。),然后从getValue()调用此方法。问题是: A类和B类不可修改!。没有方法可以添加或更改,它们的类层次结构是固定的,我没有编写他们的代码,我也没有访问源。

请注意,这也适用于以下情况 - 出于任何原因 - 我不想更改print()A的代码。

有没有办法在不使用B的情况下这样做?

以下是使用instanceof(不好!)的解决方案。

instanceof

}

3 个答案:

答案 0 :(得分:5)

当您因任何原因无法访问原始代码时,您最终不得不依赖于instanceof之类的东西。在这些情况下,它本身并不坏 - 你的双手被捆绑。

我要做的是创建一个在你的T上通用化的包装类,给它一个getValue,用你提出的instanceof进行测试,并明确指出这个类存在的原因是为了使用A或B提供一致的界面。它仍然很严重,但你已经在一个地方包含了粗略。

答案 1 :(得分:3)

要扩展Matt's answer,我会考虑为这些类采用Facade Pattern。这意味着您创建一个单独的类(或两个)来包含所有这两个类所需的功能。这包括添加一种方法,正如马特建议的那样。

好处是您可以将应用程序与无法控制的API分离。如果您不需要原始库中的所有方法,您还有机会简化API。

答案 2 :(得分:0)

谢谢你和@Matt。猜猜这个绝对是最干净的方式。将提供不使用instanceof的完整代码:

public static void main(String[] args){
    A a = new A();
    B b = new B();
    AWrapper aw = new AWrapper(a);
    BWrapper bw = new BWrapper(b);
    print(aw);
    print(bw);
}

public static void print(Wrapper t){
    System.out.println(t.getValue());
}

public static class A {
    public String getA(){
        return "A";
    }
}
public static class B extends A {
    public String getB(){
        return "B";
    }
}

public static interface Wrapper{
    public String getValue();
}

public static class AWrapper implements Wrapper{
    A a;
    public AWrapper (A a){
        this.a = a;
    }
    public String getValue(){
        return a.getA();
    }
}

public static class BWrapper implements Wrapper{
    B b;
    public BWrapper (B b){
        this.b = b;
    }
    public String getValue(){
        return b.getB();
    }
}