所选项目的原始代码为:
public void setSelectedItem(Object anObject) {
Object oldSelection = selectedItemReminder;
Object objectToSelect = anObject;
if (oldSelection == null || !oldSelection.equals(anObject)) {
if (anObject != null && !isEditable()) {
// For non editable combo boxes, an invalid selection
// will be rejected.
boolean found = false;
for (int i = 0; i < dataModel.getSize(); i++) {
E element = dataModel.getElementAt(i);
if (anObject.equals(element)) {
found = true;
objectToSelect = element;
break;
}
}
if (!found) {
return;
}
}
在我看来这行
if (anObject.equals(element)) {
应该是
if (element.equals(anObject)) {
考虑一个显示例如的组合框。语言 然后你就像
这样的课程class Language {
String code; // eg. "en"
String name; // eg. "English"
...
}
如果将语言项添加到ComboBox,则toString函数用于显示项目。在上面的类中,toString函数将返回名称。调用setSelectedItem(&#34; en&#34;)失败,因为
String.equals(语言)将失败,因为Language.toString()将返回&#34;英语&#34;
另一种方式是Language.equals(String),因为语言可以覆盖
boolean equals(String comp) {
return comp.equals(code)
}
为了澄清,我知道如何创建一个具有所需行为的Combobox,我的问题是:原始代码中的比较是一个错误还是我错过了一些基本的东西?
答案 0 :(得分:2)
正确实施的Object.equals是对称的,这意味着anObject.equals(element)
和element.equals(anObject)
之间应该没有区别。
您正在描述组合框模型包含Item
类型的对象的情况,但您希望通过指定Prop
类型的对象来选择项目,其中Prop
的值}描述了Item
的一些属性。
使用技术上不正确的equals()
方法实现,您可以通过传递Prop
而不是Item
的实例来选择组合框项目。
使用原始代码,您必须在equals()
课程中提供损坏的Prop
实施,并且通过修改,您必须在equals()
中提供损坏的Item
实施类。如果Prop
是某个库类(在您的示例中为String
),那么前一种情况当然是不可能的,并且我假设您提议修改的原因是允许后一种情况。
我不确定图书馆创建者是否试图阻止程序员通过选择特定的equals()
表达式来实现损坏的anObject.equals(element)
,但即使它是element.equals(anObject)
,它仍然会不良做法只是为了简化组合框选择而故意提供错误的equals()
实现。
按属性执行选择的正确方法是在组合框数据中搜索具有所需属性的项目,或者创建具有所需属性的全新Item
实例,然后将该项目传递给{ {1}}。
如果你很幸运已经使用了Java 8,那么从列表中选择所需的项目是一行的,如果没有,那么你将不得不用循环编写一些样板代码,但至少你将拥有正确的{{ 1}}实施和清洁良心。
答案 1 :(得分:0)
要覆盖继承的equals方法,您应该将对象作为参数而不是String
传递public boolean equals(Object obj){
//code goes here
}