gpt4 book ai didi

Java界面设计: interface vs boolean method

转载 作者:行者123 更新时间:2023-12-04 16:31:56 25 4
gpt4 key购买 nike

我在以下 2 种设计中进行选择。您会推荐哪个?为什么?

我很怀疑在第二种方法的接口(interface)中放置 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
}
}
}

对比

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
}
}
}

最佳答案

第二种方法肯定更好。

在第一种方法中,getter 和 setter 存在于 Bar 和 Baz 类中,并且可以被调用...不管是什么 hasTime() 返回!

您可以覆盖 Baz 中的 getter 和 setter,以便它们抛出(例如)OperationNotSupported 异常。但即使这样也有点“恶心”:

  • 如果比较程序如何使用这两个版本,第一个版本要求您记住调用 hasTime(),而第二个版本编译器将告诉 如果您忘记类型转换为与 TimedObject 兼容的类型。

  • 第一个版本违反了可替换性原则,因为 Baz 的行为方式与其父类(super class) Foo 不兼容。

关于Java界面设计: interface vs boolean method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5592562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com