2008-09-26 57 views
25

Tôi có một phương pháp cho phép nói:Java: Enum tham số trong phương pháp

private static String drawCellValue(
    int maxCellLength, String cellValue, String align) { } 

và như bạn có thể nhận thấy, tôi có một tham số gọi là class. Bên trong phương thức này, tôi sẽ có một số điều kiện nếu giá trị là 'left' hoặc 'right' .. thiết lập tham số là String, rõ ràng là tôi có thể truyền bất kỳ giá trị chuỗi nào. Tôi muốn biết nếu nó có thể để có một giá trị Enum như một tham số phương thức, và nếu như vậy, làm thế nào?

Chỉ trong trường hợp ai đó nghĩ về điều này; Tôi nghĩ về việc sử dụng giá trị Boolean nhưng tôi không thực sự ưa thích nó. Trước tiên, làm thế nào để kết hợp đúng/sai với trái/phải? (Ok, tôi có thể sử dụng bình luận nhưng tôi vẫn thấy nó bẩn) và thứ hai, tôi có thể quyết định thêm một giá trị mới, như 'biện minh', vì vậy nếu tôi có nhiều hơn 2 giá trị có thể, loại Boolean chắc chắn không thể sử dụng.

Bất kỳ ý tưởng nào?

+4

+1 vì không muốn sử dụng boolean & comments - cảm ơn bạn, thưa ngài. – wchargin

Trả lời

56

này nên làm điều đó:

private enum Alignment { LEFT, RIGHT };  
String drawCellValue (int maxCellLength, String cellValue, Alignment align){ 
    if (align == Alignment.LEFT) 
    { 
    //Process it... 
    } 
} 
1

Chắc chắn, bạn có thể sử dụng một enum. Một cái gì đó giống như công việc sau đây?

enum Alignment { 
    LEFT, 
    RIGHT 
} 

tin static String drawCellValue (int maxCellLength, String cellValue, sự liên kết Alignment) {}

Nếu bạn muốn sử dụng một boolean, bạn có thể đổi tên các tham số align để cái gì đó như alignLeft. Tôi đồng ý rằng việc triển khai này không sạch sẽ, nhưng nếu bạn không lường trước được nhiều thay đổi và đây không phải là giao diện công khai, đây có thể là lựa chọn tốt.

1

Bạn cũng có thể sử dụng lại SwingConstants. {LEFT, RIGHT}. Chúng không phải là enums, nhưng chúng đã tồn tại và được sử dụng ở nhiều nơi.

19

Thậm chí mát với enums bạn có thể sử dụng chuyển đổi:

switch (align) { 
    case LEFT: { 
     // do stuff 
     break; 
    } 
    case RIGHT: { 
     // do stuff 
     break; 
    } 
    default: { //added TOP_RIGHT but forgot about it? 
     throw new IllegalArgumentException("Can't yet handle " + align); 

    } 
} 

Enums là mát mẻ bởi vì đầu ra của ngoại lệ sẽ là tên của giá trị enum, chứ không phải là một số giá trị int tùy ý.

4

Tôi thích điều này tốt hơn rất nhiều. làm giảm if/switch, chỉ cần thực hiện.

private enum Alignment { LEFT, RIGHT; 

void process() { 
//Process it... 
} 
};  
String drawCellValue (int maxCellLength, String cellValue, Alignment align){ 
    align.process(); 
} 

tất nhiên, nó có thể là:

String process(...) { 
//Process it... 
} 
+4

+1 Ý tưởng đang đi đúng hướng. Tuy nhiên, phương thức quy trình phải trừu tượng, và LEFT và RIGHT phải cung cấp phương thức thực thi. –

+1

@ ChrisJester-Young Điều đó phụ thuộc vào sự tương đồng của chúng. Nếu chúng khá giống nhau, các giá trị có thể chỉ cung cấp một phương thức riêng mà thực hiện một phần của quá trình thực thi, và 'process()' thực hiện công việc chính và gọi chúng nếu được yêu cầu. – glglgl

+0

@glglgl Quyền, cũng vậy. Tôi chỉ không muốn nhìn thấy mã như 'if (this == LEFT)', đó là tất cả. :-) –

1

Tôi không quá chắc chắn tôi sẽ đi và sử dụng một enum như là một lớp chính thức đầy đủ - đây là một ngôn ngữ hướng đối tượng, và là một trong nguyên lý cơ bản nhất của hướng đối tượng là một lớp nên làm một việc và làm tốt.

Một enum đang làm một công việc khá tốt là một enum, và một lớp học đang làm một công việc tốt như một lớp học. Trộn hai cái tôi có một cảm giác sẽ khiến bạn gặp rắc rối - ví dụ, bạn không thể truyền một thể hiện của một enum như một tham số cho một phương thức, chủ yếu là vì bạn không thể tạo một thể hiện của một enum.

Vì vậy, ngay cả khi bạn có thể enum.process() không có nghĩa là bạn nên.

1

Bạn có thể sử dụng một trong enum cho biết các thông số như thế này:

public enum Alignment { LEFT, RIGHT } 
private static String drawCellValue(
int maxCellLength, String cellValue, Alignment align) {} 

sau đó bạn có thể sử dụng một công tắc hoặc câu lệnh if để thực sự làm điều gì đó với biết tham số.

switch(align) { 
case LEFT: //something 
case RIGHT: //something 
default: //something 
} 

if(align == Alignment.RIGHT) { /*code*/} 
Các vấn đề liên quan