理解';有效的Java';关于比较
这是关于类可以实现的比较契约 无法使用新值扩展可实例化类 组件,同时将比较器保留为协定,除非 愿意放弃面向对象抽象的好处。相同的 解决方法也适用。如果要将值组件添加到 实现Comparable的类,不要扩展它;写一篇无关的文章 类,该类包含第一个类的实例。然后提供一个“视图” 方法返回此实例。这使您可以自由地实现 在第二个类中,您喜欢的任何比较方法,同时允许 它的客户端将第二个类的实例视为 需要的时候第一节课 我读过。它帮助我回答了一两个问题,但下面的问题我仍然没有回答 1) 如果我将这两个类定义为不相关的,我可以随意实现compareTo方法。同意。但我如何使这两个类具有is-a/父-子关系。有人能解释Joshua称之为“视图”的方法吗 有人能解释约书亚所谓的“视图”方法吗 我将继续Jon Skeet的简单示例: “提供视图”而不是“扩展”将意味着像这样设计类层次结构:理解';有效的Java';关于比较,java,oop,object,compareto,Java,Oop,Object,Compareto,这是关于类可以实现的比较契约 无法使用新值扩展可实例化类 组件,同时将比较器保留为协定,除非 愿意放弃面向对象抽象的好处。相同的 解决方法也适用。如果要将值组件添加到 实现Comparable的类,不要扩展它;写一篇无关的文章 类,该类包含第一个类的实例。然后提供一个“视图” 方法返回此实例。这使您可以自由地实现 在第二个类中,您喜欢的任何比较方法,同时允许 它的客户端将第二个类的实例视为 需要的时候第一节课 我读过。它帮助我回答了一两个问题,但下面的问题我仍然没有回答 1) 如果我将这两个类定
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
有些误导性:你在人里面得到的是命名的东西,而不是碰巧是命名的东西的人。这就限制了compareTo
:例如,你不能在其他命名的事物中对人进行排序。你不能,这就是重点。你实现了一个has-a关系。@JBNizet你应该对你的评论进行一点扩展,并将其作为答案发布。我想不出用这种方法做以下事情的方法。NamedThing thing=新人()。你是说这种语法在创建person对象时不可能使用这种方法吗?@AnushaPachunuri正确,这是这种方法的一个结果。你需要做Person p=newperson();NamedThing personshing=p.asNamedThing()代码>,我仍然可以按原样使用所有多态性概念?比如说方法重写中的动态绑定?它们仍然是可以实现的,对吗?@AnushaPachunuri不,我认为这就是Joshua试图表达的观点:不要扩展可比较的类来增加价值成分,让类保持原样。这些新类和它们包含的可比较的类不会有多态性。
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;
}