当前位置: 首页 > 知识库问答 >
问题:

很难理解《高效Java》中有关compareTo的摘录

景翰音
2023-03-14

这是关于类可以实现的比较契约。

除非您愿意放弃面向对象抽象的好处,否则无法在保留compareTo契约的同时使用新的值组件扩展可实例化类。同样的解决方法也适用。如果你想给实现Comparable的类添加一个值组件,不要扩展它;编写一个不相关的类,其中包含第一个类的实例。然后提供一个返回该实例的“视图”方法。这使您可以在第二个类上实现您喜欢的任何compareTo方法,同时允许其客户端在需要时将第二个类的实例视为第一个类的实例。

我已经读过为什么我不能在保留compareTo契约的同时用一个新的值组件扩展一个实例化类?。它帮助我回答了一两个问题。但我仍然没有回答下面的问题。

1) 如果我将这两个类定义为不相关的,我就可以随心所欲地实现compareTo方法。我同意。但是,我如何使这两个类具有is-a/亲子关系呢。有人能解释约书亚所说的“视图”方法吗?

共有1个答案

通典
2023-03-14

有人能解释一下约书亚所说的“观点”方法吗?

我将继续Jon Skeet从你在帖子中链接的答案中给出的简单示例:

// In Jon's code, Person derives from NamedThing
class NamedThing {
    String name;
}

class Person extends NamedThing {
    Date dateOfBirth;
}

“提供视图”而不是“扩展”将意味着像这样设计类层次结构:

class NamedThing {
    String name;
}

class Person {
    private  NamedThing namedThing;
    // Here is the view method
    public NamedThing asNamedThing() {
        return namedThing;
    }
    // Here is a convenience method for accessing name directly
    public String getName() {
        return namedThing.name;
    }
    Date dateOfBirth;
}

这使您可以在Person内部实现新的比较,因为不需要与超类保持兼容。如果您需要将您的个人视为NamedThing,请调用asNamedThing()。

请注意,由于这不是一种is-a关系,asNamedThing有点误导:你在人里面得到了命名的东西,而不是碰巧是命名的东西的人。这限制了compare to的适用性:例如,您不能在其他命名内容中对人员进行排序

 类似资料:
  • 但是当我给另一个人指定了彼得的引用,然后改变了彼得的名字时,这个人不知道这一点,并打印了第一个名字。既然它存储了Peter的内存引用,这怎么可能呢?难道它不能跟随对它所做的更改吗?

  • 一篇滴滴Java日常实习一面面经,难度很大。 来源:点击跳转

  • 如果int(integer)类型的变量在Java中本质上是原子的,那么为什么我们在示例中看到整数值的不一致状态:https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html 语言规范保证,除非变量类型为long或double,否则读取或写入变量是原子的[JLS,17.4.7]。换句话说,读取long或doub

  • 我无法理解为什么ExceptionHandlerExceptionResolver会抛出异常。我已经编写了一个自定义@RestControlller建议ExceptionHandler来捕获Spring Boot应用程序抛出的异常。捕获后,我的ExceptionHandler返回来自抛出的异常的消息作为响应。但我仍然从ExceptionHandlerExceptionResolver收到一条日志消

  • 问题内容: 在排序列表上工作时,我到了要为原始长值实现compareTo()函数的地步。 我 不是在寻找明显的幼稚实现 ,而是想知道是否有一种优雅的单行代码可以做到这一点(而无需创建新的Long(value))。 也许是这样的: 任何人都可以验证是否行得通和/或建议其他实施方式吗? 问题答案: 一种班轮代码: 您的代码无法在所有值上正常工作,请为Integer.MIN_VALUE-Integer.