在以下上下文中使用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)方法的参数吗?
编辑:请阅读已接受答案的评论.
有时候没有四处使用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值得回答的组合可以解决问题.
代码是如何调用IWriter的?想必您也必须确定那里的类型?在这种情况下,您已经知道您需要什么样的作家。您已经根据类型进行调度。
你的作家并不是真正可以替代的,WriterA 只能做 As 等等。在这种情况下,通过声明它们位于继承层次结构中,您不会获得任何好处。