我在以下两种设计中进行选择。你会推荐哪一个?为什么?
对于将get/set方法放在第二个方法的接口中,我非常怀疑。对此有何评论?
public class Foo {
Time time;
boolean hasTime();
Time getTime() { return time; }
void setTime() { this.time = time; }
}
public class Bar extends Foo {
boolean hasTime() { return true; }
}
public class Baz extends Foo {
boolean hasTime() { return false; }
}
main() {
for (Foo foo : foos) {
if (foo.hasTime()) {
// do something
}
}
}vs
public class Foo {
}
public class Bar extends Foo implements TimedObject {
Time time;
Time getTime() { return time; }
void setTime() { this.time = time; }
}
public interface TimedObject {
Time getTime();
void setTime();
}
main() {
for (Foo foo : foos) {
if (foo instance of TimedObject) {
// do something
}
}
}发布于 2011-04-08 16:40:55
第二种方法绝对是更好的。
在第一种方法中,getter和setter同时存在于Bar和Baz类中,并且可以调用...不管hasTime()返回什么!
您可以覆盖Baz中的getter和setter,这样它们就会抛出(例如) OperationNotSupported异常。但即使这样也有点“讨厌”:
如果比较一个程序如何使用这两个版本,第一个版本要求您记得调用hasTime(),而第二个版本的编译器会告诉您,如果您忘记将类型转换为与TimedObject.
Baz的行为方式与其超类Foo.不兼容
发布于 2011-04-08 16:42:49
我更喜欢第二种方法,因为实现的接口提供了一个类型,而不考虑实际的对象类型,并保证了一系列可用的方法(由接口定义的“契约”)。
通常,不要为bygetters访问的属性设置boolean hasXX()方法,因为通常您应该测试if (Y.getX() != null)以测试该属性是否已设置或是否具有任何值。
发布于 2011-04-08 16:49:57
我也喜欢第二种选择。此外,如果您对接口中的getter和setter有疑问,您可以始终考虑将这一个接口一分为二:
public interface TimedObject {
Time getTime();
}
public interface MutableTimedObject extends TimedObject {
void setTime(Time time);
}
...
if (foo instance of TimedObject) {
// do something
if (foo instance of MutableTimedObject) {
// change time
}
}https://stackoverflow.com/questions/5592562
复制相似问题