首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java接口设计:接口与布尔方法

Java接口设计:接口与布尔方法
EN

Stack Overflow用户
提问于 2011-04-08 16:36:38
回答 4查看 2.8K关注 0票数 2

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

对于将get/set方法放在第二个方法的接口中,我非常怀疑。对此有何评论?

代码语言:javascript
复制
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

代码语言:javascript
复制
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
        }
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-08 16:40:55

第二种方法绝对是更好的。

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

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

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

  • The第一个版本兼容的赋值类型,则会违反可替换性原则,因为Baz的行为方式与其超类Foo.

不兼容

票数 4
EN

Stack Overflow用户

发布于 2011-04-08 16:42:49

我更喜欢第二种方法,因为实现的接口提供了一个类型,而不考虑实际的对象类型,并保证了一系列可用的方法(由接口定义的“契约”)。

通常,不要为bygetters访问的属性设置boolean hasXX()方法,因为通常您应该测试if (Y.getX() != null)以测试该属性是否已设置或是否具有任何值。

票数 2
EN

Stack Overflow用户

发布于 2011-04-08 16:49:57

我也喜欢第二种选择。此外,如果您对接口中的getter和setter有疑问,您可以始终考虑将这一个接口一分为二:

代码语言:javascript
复制
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
        }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5592562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档