2012-06-22 27 views
5

Tôi có danh sách các loại tài khoản được định nghĩa là enums trong việc triển khai dịch vụ web. Tuy nhiên, khi người tiêu dùng gọi dịch vụ web, nó chuyển một Chuỗi cần được chuyển thành enum.Xác thực thành công Chuỗi để chuyển đổi enum trong Java

Cách tốt nhất để xác thực rằng Chuỗi đã cho sẽ được chuyển đổi thành công thành enum là gì?

Tôi đã sử dụng cách tiếp cận sau, nhưng điều này có thể là lạm dụng ngoại lệ (theo Java hiệu quả, mục 57).

AccountType accountType = null; 
try{ 
    accountType = AccountType.valueOf(accountTypeString); 
}catch(IllegalArgumentException e){ 
    // report error 
} 

if (accountType != null){ 
    // do stuff 
}else{ 
    // exit 
} 
+1

Xem chủ đề này, nó có nhiều giải pháp cho điều này http://stackoverflow.com/questions/604424/java-convert-string-to-enum –

Trả lời

0

Bạn có thể bắt IllegalArgumentException, sẽ bị ném khi có giá trị xấu.

+0

Tôi sửa đổi mã để bao gồm IllegalArgumentException .. nó vẫn còn và ngoại lệ mặc dù – Dima

+0

Có, nó được sử dụng ngoại lệ như thế nào họ nên được sử dụng, không phải là một bắt lớn tất cả. Tôi đã không nhìn thấy "mục 57" bạn đang đề cập đến nhưng tôi giả định rằng họ đang nói rằng bạn chỉ nên ném một ngoại lệ khi có một lỗi thực sự, trong trường hợp này nó là một lỗi và bạn không thể tránh nó anyway vì việc triển khai Java đang ném lỗi đó. –

1

Bạn có thể đi qua các giá trị enum và kiểm tra xem tên của mỗi chữ là bằng chuỗi một cái gì đó của bạn như

for (Test test : Test.values()) { 
    if (str.equals(test.name())) { 
     return true; 
    } 
} 
return false; 

Các enum là:

public enum Test { 
    A, 
    B, 
} 

Ngoài ra bạn có thể trả lại enum hằng số hoặc null, vì enums thường nhỏ, nó sẽ không phải là vấn đề hiệu năng.

+0

điều này thực sự sẽ không hoạt động, do đó, trong lần lặp đầu tiên nếu str không xảy ra bằng với kiểu Enum, bạn sẽ trả về false, thậm chí nghĩ rằng nó có thể vẫn còn hiện diện trong mảng – Dima

+0

Nếu bạn nhìn sâu hơn, Câu lệnh "return false" sẽ chỉ xảy ra sau khi tất cả các giá trị trên mảng được chọn, đây là khi câu lệnh for kết thúc. –

0

Sử dụng Optional loại dữ liệu từ Ổi.

Có phương thức AccountType.valueOf giá trị trả về của loại Optional<AccountType>. Sau đó, các mã sử dụng tại chỗ sẽ trở thành:

Optional<AccountType> accountType = AccountType.valueOf(accountTypeString)); 
if (accountType.isPresent()) { 
    AccountType a = accountType.get(); 
    // do stuff 
} else { 
    // exit 
} 
+0

vẫn thấy ngoại lệ gây phiền nhiễu này .. – Dima

+0

Ngoại lệ là gì? – missingfaktor

+0

Bạn có phải là người sẽ tác giả 'AccountType.valueOf'? Hoặc là từ một số API bạn đang tiêu thụ? – missingfaktor

2

Tôi personaly sử dụng EnumUtils từ thư viện Apache Commons.

Thư viện đó chứa nhiều lớp util hữu dụng (ví dụ: cho Strings) và là phải có trong bất kỳ dự án Java nào và khá nhẹ (300ko).

Dưới đây là một số mẫu mã tôi sử dụng:

TypeEnum strTypeEnum = null; 

// test if String str is compatible with the enum 
if(EnumUtils.isValidEnum(TypeEnum.class, str)){ 
    strTypeEnum = TypeEnum.valueOf(str); 
} 
Các vấn đề liên quan