我的一些课程应该区别对待。哪种解决方案更好:
以下示例说明了上述情况:
1
interface SpecialTreatment {}
class Base {}
class Special extends Base implements SpecialTreatment {}
class Normal extends Base {}
Base reference = new Special();
if(reference instanceof SpecialTreatment)
// do something special
else
// normal class
2
interface Treatment {
boolean special();
}
class Base {}
class Special extends Base implements Treatment {
boolean special() { return true; }
}
class Normal extends Base implements Treatment {
boolean special() { return false; }
}
Treatment reference = new Special();
if(reference.special() == true)
// do something special
else
// normal class
答案 0 :(得分:1)
如果以不同方式处理该类的“原因”是设计决策,则通过接口签名将其标记为如解决方案1中那样。
如果您的应用程序中的某个状态可能会对此进行管理,请使用解决方案2.
这方面的例子是java.io.Serializable接口,没有用于标识可序列化实现的方法或字段。您在设计时决定对象是否可序列化。
附加评论之后关于instanceof表现的说明。
您还可以考虑使用Annotations替代......
- 在董事会上发表评论后编辑---
如果你真的想不要关注instanceof(非常快)或注释,你可以这样做..
interface Special {
bool isSpecial();
}
abstract class RuntimeSpecial implements Special {
protected abstract bool _determineSpecial();
public isSpecial() { return _determineSpecial(); }
}
class IsSpecial implements Special {
public isSpecial() { return true; }
}
class IsNotSpecial implements Special {
public isSpecial() { return false; }
}
现在扩展适当的......