是否可以使用instanceof运算符来实现两个并行的函数和参数层次结构?

Tob*_*obi 5 java instanceof

在以下上下文中使用instanceof运算符是不好的做法吗?

public interface IWriter {
    public abstract void write(Dto dto);
}

public abstract class Dto {
    private long id;
    public void setId(long id) {this.id = id;}
    public long getId() {return id;}
}

public class DtoA extends Dto {
   ...
}

public class DtoB extends Dto {
   ...
}

public class MyWriterA implements IWriter {
   @Override
   public void writer(Dto dto) {
     if (!(dto instanceof DtoA))
        return;
     ...
   }
}

public class MyWriterB implements IWriter {
   @Override
   public void writer(Dto dto) {
     if (!(dto instanceof DtoB))
        return;
     ...
   }
}
Run Code Online (Sandbox Code Playgroud)

关于该运算符的使用有很多神话,我不完全确定我所做的不是下载.

我有很多不同的编写器实现,我想在一个界面中组合.问题不是每个DTO都适用于每个作家.在我的实际代码中,存在DTO的深层次结构,其扩展DtoA和DtoB,并且DtoA或DtoB的层次结构分支适用于编写者,但仅在少数情况下两者都适用.

我应该避免使用抽象类Dto作为抽象write(Dto dto)方法的参数吗?

编辑:请阅读已接受答案的评论.

Boh*_*ian 5

有时候没有四处使用instanceof- 没有必要感到羞耻.

键入IWriter可能会有所帮助:

public interface IWriter<T extends Dto> {
    public abstract void write(T dto);
}
Run Code Online (Sandbox Code Playgroud)

然后

public class MyWriterA implements IWriter<DtoA> {
   @Override
   public void writer(DtoA dto) {
     // No need for instanceof, because it can't be anything else
     ...
   }
}
Run Code Online (Sandbox Code Playgroud)

也许这种打字和Brian Agnew值得回答的组合可以解决问题.


djn*_*jna 3

代码是如何调用IWriter的?想必您也必须确定那里的类型?在这种情况下,您已经知道您需要什么样的作家。您已经根据类型进行调度。

你的作家并不是真正可以替代的,WriterA 只能做 As 等等。在这种情况下,通过声明它们位于继承层次结构中,您不会获得任何好处。