2013-01-04 2 views
1

Object의 equal 메소드 내에서 String [] 비교에 대한 설명이 필요합니다. 다음은 내 코드 스냅 샷입니다. 이 코드를 실행하면 true 및 false 대신 true 및 false를 제공합니다. 내 경우에는 작업 클래스가 각 호출마다 고유 ID를 생성합니다. 내가 뭘 잘못하고 있니? 어떤 제안이라도 인정 될 것입니다.문자열 배열이있는 클래스에 대해 equals()를 재정의하는 방법은 무엇입니까?

public class JobTask extends Task { 

    String[] args; 

    public WFTask(String[] args) { 
     this.args = args; 
    } 
    @Override 
    public boolean equals(Object obj) {   
      if (! (obj instanceof String[])){ 
      return false;   
      } 
      String[] arguments = (String[]) obj; 
      boolean ret = Arrays.equals(this.args , arguments); 
      return ret; 
    } 
    @Override 
    public void execute(TaskExecutionContext context) throws RuntimeException { 
      -------------- 
      -------------- 
    } 
    public static void main(String[] args) { 
      String[] arg1 = {"a","b","c"}; 
      String[] arg2 = {"a","b","c"}; 
      System.out.println(Arrays.equals(arg1,arg2)); 
      JobTask t1 = new JobTask(arg1); 
      JobTask t2 = new JobTask(arg2); 
      System.out.println(t1.equals(t2)); 
    } 
} 

public abstract class Task { 
    private Object id = GUIDGenerator.generate(); 
    public Task() { 
    } 
    Object getId() { 
     return id; 
    } 
    public abstract void execute(TaskExecutionContext context)     throws RuntimeException; 
} 

답변

3
@Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     JobTask other = (JobTask)obj; 
     if (!Arrays.equals(args, other.args)) 
      return false; 
     return true; 
    } 
+0

나는 실수를했습니다. 그것은 나를 움직이게했다. 고마워. – user648330

3

당신은 디버거, 힌트, 힌트에서 볼 수있을 것입니다하지만

당신은

System.out.println(t1.equals(t2)); 

을 테스트하고 있지만

if (! (obj instanceof String[])){ 
     return false;   
     } 

을 작성했습니다 그리고 t2는이 아니기 때문에이것은 false를 반환합니다. 난 당신이

if (!(obj instanceof JobTask)) 
     return false;   

    JobTask other= (JobTask) obj; 
    return Arrays.equals(this.args , other.args); 
+0

그것은 나를 움직이게했다. 고마워. – user648330

1

당신의 equals 방법은 JobTask 아닌 String[] 받아 작성하는 목적으로 생각한다. 예를 들면 다음과 같이 다시 작성해야합니다.

@Override 
public boolean equals(Object obj) { 
    if (! (obj instanceof JobTask)){ 
     return false; 
    } 
    String[] arguments = ((JobTask) obj).args; 
    boolean ret = Arrays.equals(this.args , arguments); 
    return ret; 
} 
관련 문제