这是关于类可以实现的比较契约。
除非您愿意放弃面向对象抽象的好处,否则无法在保留compareTo契约的同时使用新的值组件扩展可实例化类。同样的解决方法也适用。如果你想给实现Comparable的类添加一个值组件,不要扩展它;编写一个不相关的类,其中包含第一个类的实例。然后提供一个返回该实例的“视图”方法。这使您可以在第二个类上实现您喜欢的任何compareTo方法,同时允许其客户端在需要时将第二个类的实例视为第一个类的实例。
我已经读过为什么我不能在保留compareTo契约的同时用一个新的值组件扩展一个实例化类?。它帮助我回答了一两个问题。但我仍然没有回答下面的问题。
1) 如果我将这两个类定义为不相关的,我就可以随心所欲地实现compareTo方法。我同意。但是,我如何使这两个类具有is-a/亲子关系呢。有人能解释约书亚所说的“视图”方法吗?
有人能解释一下约书亚所说的“观点”方法吗?
我将继续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.