在 Java 中使用 instanceOf 运算符时出错

Error in using instanceOf operator in Java

不确定第 24 行出了什么问题。我试图重写 Object.equals() 方法,但由于该方法采用 Object 类型,我想过滤掉不是实例的输入的员工。这是介绍 java 课程

我遇到了这些错误:

4 errors found:
File: /Users/wesley/Documents/Employee.java  [line: 24]
Error: ')' expected
File: /Users/wesley/Documents/Employee.java  [line: 24]
Error: variable declaration not allowed here
File: /Users/wesley/Documents/Employee.java  [line: 24]
Error: ';' expected
File: /Users/wesley/Documents/Employee.java  [line: 30]
Error: 'else' without 'if'

这是代码。

//employee number, name, and salary
public class Employee{
  private String name;
  private final int ID;
  private double salary;
  private static int lastID;
  public Employee(String name, double salary){
    this.name=name;
    ID=Employee.lastID+1;
    this.salary=salary;
    Employee.lastID=Employee.lastID+1;
  } 
  public String getName(){return name;}
  public int getID(){ return ID; }
  public double getSalary(){ return salary;}
  public void setName(String newName){name=newName;}
  public void raise(double newSalary){ salary=newSalary;}
  @Override
  public String toString(){
    return "Name: "+ getName() + "\nID: " + getID() + "\nSalary: " + getSalary();
  }
  @Override
  public boolean equals(Object o){
    if(o instanceOf Employee){//errors are here!
    Employee input=(Employee) o;
    if(this.getSalary()==input.getSalary() && this.getName().equals(input.getName())){
      return true;
    }
  }
    else{return false;
    }//another error here
      }
    }

懒得修改缩进了。当我在

中粘贴东西时发生了

它是 instanceof,小写 o,而不是您现在使用的“instanceOf”。更正此错误后,您可以看到并非该方法的所有分支都有 return 语句 - 如果输入第一个 if 而第二个没有输入,会发生什么情况?

简化布尔条件和冗余 else 语句可以解决这个问题:

@Override
public boolean equals(Object o){
    if (o instanceof Employee) { // instanceof instead of instanceOf
        Employee input=(Employee) o;
        return this.getSalary() == input.getSalary() && 
               this.getName().equals(input.getName());
    }
    return false;
}

有很多地方可以改进。

首先,instanceof关键字是小写的。

其次,如果您覆盖 equals(Object),您还必须覆盖 hashCode(),如 this answer 中所述。这个答案还包含如何实现 equalshashCode.

的优秀示例

第三,您的实现允许 namenull,在这种情况下 this.getName()null 而您的检查

this.getName().equals(input.getName()) 

抛出一个 NullPointerException。我建议您遵循 answer or this tutorial 中更稳健的做法,或者通过在构造函数和 setName.[=36 中检查它来确保 name 永远不会是 null =]

其他改进和备注

如果有字段 ID,我假设它是用来 识别 员工的。在那种情况下,它必须包含在equals检查中。

如果有“ID”,为什么还要检查 namesalary?改变 salary 是否也意味着它变成了不同的 Employee?如果我更正 Employee?

的姓名,则相同

ID 的初始化不是线程安全的,可能导致不同的 Employees 拥有相同的 ID。考虑做:

import java.util.concurrent.atomic.AtomicInteger;
///
private static AtomicInteger lastID = new AtomicInteger();

然后在构造函数中做

this.ID = lastID.getAndIncrement();

这使得以下行不再需要:

Employee.lastID=Employee.lastID+1;

另一件事是 raise 方法还允许将工资设置为 低于 之前的值。我会检查一下,或者将 raise 重命名为 setSalary.

考虑到所有这些,它会导致类似的结果:

import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;

public class Employee {
    private static AtomicInteger lastID = new AtomicInteger();
    private String name;
    private final int ID;
    private double salary;

    public Employee(String name, double salary) {
        this.name = name;
        ID = lastID.getAndIncrement();
        this.salary = salary;
    }

    public String getName() { return name; }

    public int getID() { return ID; }

    public double getSalary() { return salary; }

    public void setName(String newName) { name = newName; }

    public void setSalary(double newSalary) { salary = newSalary; }

    @Override
    public String toString() {
        return "Name: " + getName() + "\nID: " + getID() + "\nSalary: " + getSalary();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Employee)) return false;
        Employee employee = (Employee) o;
        return ID == employee.ID;
    }

    @Override
    public int hashCode() {
        return Objects.hash(ID);
    }
}