2012-10-17 22 views
7

下面是我的問題的一個抽象示例:我有一個通用類(Car),它有一個類型(brand)。所有對象只應根據品牌而有所不同,基於這個品牌應該以不同的方式處理。根據枚舉類型調用特定方法?

該類的所有對象都收集在服務類的列表中。該服務應該在整個清單上執行一個例程,這與大多是一樣。只是一個函數調用應該有所不同。

基於這種類型,我想調用不同的方法:目前,我爲枚舉類型聲明瞭equals,並根據結果調用不同的方法。但是這有點難看,我想知道是否有更好的解決方案?

class Car { 
    public enum Brand { 
     BMW, AUDI; 
    } 

    private Brand brand; 

    specificMeth1(); 
    specificMeth2(); 
} 


class Service { 

    List<Car> bmw; 
    List<Car> Audi; 

    processCar() { 
     processList(bmw); 
     processList(audi); 
    } 

    processList(List<Car> list) { 
     for (Car car : list) { 
      if (car.getBrand.equals(Brand.BMW)) { 
       specificMeth1(); 
      } else { 
       specificMeth2(); 
      } 
     } 
    } 
} 
+0

旁註:你不需要使用'equals( )'與枚舉。 'car.getBrand()== Brand.BMW'工作得很好。 –

回答

24

你應該把在枚舉的方法:

public enum Brand { 
    BMW { 
     @Override 
     public void doSomething(); 
    }, 
    AUDI { 
     @Override 
     public void doSomething(); 
    }; 

    public abstract void doSomething(); 
} 

var.getBrand().doSomething(); 
+1

不錯的答案+1。 – Juvanis

+1

當你快! –

+0

地獄是一個+5? – sErVerdevIL

4

考慮在枚舉定義的抽象方法,像這樣:

public enum Brand { 
    BMW { 
     public void specificMethod() { 
      System.out.println("meth1"); 
     } 
    }, 

    AUDI { 
     public void specificMethod() { 
      System.out.println("meth2"); 
     } 
    }; 

    public abstract void specificMethod(); 
} 

然後,您可以撥打:

for (Car car : list) { 
    car.getBrand().specificMethod(); 
}