2012-10-17 40 views
7

Đây là một ví dụ trừu tượng về vấn đề của tôi: Tôi có một lớp học chung (Car) có một loại (brand). Tất cả các đối tượng chỉ nên khác nhau theo thương hiệu và dựa trên thương hiệu này nên được xử lý khác nhau.Gọi một phương pháp cụ thể dựa trên loại enum?

Tất cả các đối tượng của lớp này được thu thập trong danh sách Lớp dịch vụ. Dịch vụ phải thực hiện một thường trình trên toàn bộ danh sách, là chủ yếu là giống nhau. Chỉ cần một cuộc gọi hàm ở giữa sẽ khác nhau.

Dựa trên loại này tôi muốn gọi các phương pháp khác nhau: Hiện tại tôi đang khẳng định bằng cho loại enum và gọi các phương thức khác nhau dựa trên kết quả. Nhưng đây là loại xấu xí và tôi tự hỏi nếu có giải pháp tốt hơn về điều này?

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

Sidenote: bạn không cần sử dụng 'bằng () 'với enums. 'car.getBrand() == Brand.BMW' hoạt động tốt. –

Trả lời

24

Bạn nên đặt các phương pháp trong enum:

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

    public abstract void doSomething(); 
} 

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

câu trả lời hay nhất +1. – Juvanis

+1

Bạn đã nhanh chóng! –

+0

Trường hợp địa ngục là +5? – sErVerdevIL

4

xem xét xác định một phương pháp trừu tượng trên enum, như vậy:

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

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

    public abstract void specificMethod(); 
} 

Sau đó, bạn có thể gọi:

for (Car car : list) { 
    car.getBrand().specificMethod(); 
} 
Các vấn đề liên quan