2009-12-08 31 views
31

Tôi đang đối mặt với trường hợp sử dụng mà tôi muốn khai báo trường static final với tuyên bố khởi tạo được khai báo để ném ngoại lệ đã kiểm tra. Thông thường, nó sẽ giống như thế này:Cách xử lý bộ khởi tạo trường cuối cùng tĩnh ném trường hợp ngoại lệ đã chọn

public static final ObjectName OBJECT_NAME = new ObjectName("foo:type=bar");

Vấn đề tôi có ở đây là các nhà xây dựng ObjectName thể ném ngoại lệ kiểm tra khác nhau, mà tôi không quan tâm đến (vì tôi muốn biết tên tôi là hợp lệ, và nó là hoàn toàn nếu nó đau khổ thảm họa trong trường hợp nó không). Trình biên dịch java sẽ không cho phép tôi bỏ qua điều này (vì nó là một ngoại lệ đã kiểm tra), và tôi không muốn sử dụng đến:

 
public static final ObjectName OBJECT_NAME; 
static{ 
    try{ 
     OBJECT_NAME = new ObjectName("foo:type=bar"); 
    }catch(final Exception ex){ 
     throw new RuntimeException("Failed to create ObjectName instance in static block.",ex); 
    } 
} 

Vì các khối tĩnh thực sự rất khó đọc. Có ai có một đề nghị về cách xử lý trường hợp này một cách tốt đẹp, sạch sẽ?

+0

giải pháp cá nhân của tôi là để ném một 'CheckedExceptionsAreAPainInTheAssSometimesException', mà là một ngoại lệ thời gian chạy. Chương trình sau đó sẽ chỉ sụp đổ. – Airhead

Trả lời

40

Nếu bạn không thích các khối tĩnh (một số người không có) thì một cách khác là sử dụng phương pháp tĩnh. IIRC, Josh Bloch đã đề xuất điều này (dường như không có hiệu quả Java về kiểm tra nhanh).

public static final ObjectName OBJECT_NAME = createObjectName("foo:type=bar"); 

private static ObjectName createObjectName(final String name) { 
    try { 
     return new ObjectName(name); 
    } catch (final SomeException exc) { 
     throw new Error(exc); 
    } 
} 

Hoặc:

public static final ObjectName OBJECT_NAME = createObjectName(); 

private static ObjectName createObjectName() { 
    try { 
     return new ObjectName("foo:type=bar"); 
    } catch (final SomeException exc) { 
     throw new Error(exc); 
    } 
} 

(được sửa đổi:. Corrected ví dụ thứ hai trở về từ phương pháp thay vì giao cho static)

+2

Tôi đã không nghĩ về nó, mặc dù bây giờ tôi đọc nó tôi chắc chắn 100% tôi đã sử dụng cách tiếp cận này một thời gian dài trước đây. Tôi sẽ sử dụng điều này vì tôi không thích các khối tĩnh và cũng giống như mã của tôi có thể đọc được bởi người mới bắt đầu (Bạn không bao giờ biết ai sẽ duy trì mã của bạn sau chính mình :)). – Romain

+0

mang lại cho tôi một lỗi biên dịch của "phải trả về một kết quả của kiểu ObjectName" - một giải pháp đơn giản sẽ có 'return null' trong khối' catch'?Nhưng sau đó một chút lẻ để gỡ lỗi – mmcrae

+0

Tôi nghĩ rằng bạn đang đề cập đến khoản 59: Tránh sử dụng không cần thiết của các trường hợp ngoại lệ được kiểm tra (hiệu quả Java, 2nd Edition). Trong mục đó, Bloch đang tư vấn cho tác giả của mã đưa ra một ngoại lệ để xem xét liệu các khách hàng của nó có thể thực hiện một số hành động hữu ích khi đối mặt với ngoại lệ '. Điều đó khác với trường hợp này, trong đó câu hỏi không phải là tính hợp pháp của ngoại lệ được ném ra, nhưng cách tốt nhất để xử lý ngoại lệ. Từ việc xem tài liệu cho 'java.lang.Error', tôi có cảm giác ném một lỗi không phải là điều tốt nhất để làm ở đây. – nullstellensatz

5

static không khó đọc. Vì vậy, tôi muốn đề nghị giải pháp đó. Tuy nhiên, bạn có thể bọc đối tượng của mình vào một đối tượng khác, ví dụ: ObjectNameWrapper chia sẻ một interface với số ObjectName và người xây dựng của bạn gọi số ObjectName của bạn, ẩn tất cả ngoại lệ đã kiểm tra xảy ra. Nhưng một lần nữa, tôi sẽ đi cho các tùy chọn tĩnh.

+2

Giới thiệu một đối tượng khác có vẻ khó hiểu. –

+1

Tôi chắc chắn đồng ý với bạn. Đề xuất phương pháp tĩnh của bạn là cách tốt hơn. – Bozho

16

Mã của bạn hoàn toàn hợp lệ. Tôi không thấy khó đọc. Những cách khác sẽ chỉ làm cho nó tồi tệ hơn. Chúng chỉ khó đọc cho người mới bắt đầu, bởi vì hầu hết trong số họ không quen thuộc với điều đó. Chỉ cần làm theo các quy ước tiêu chuẩn liên quan đến thứ tự của các yếu tố trong mã. Ví dụ. không đặt bộ khởi tạo tĩnh ở nửa chừng hoặc toàn bộ phần dưới của mã và cũng không có nhiều phần tử mở rộng trên lớp. Chỉ cần đặt một ở đầu, sau khi khai báo tĩnh.

+0

Đây là một điểm rất hợp lệ (vì vậy tôi đã bình chọn nó lên mặc dù không chấp nhận nó), kiến ​​GPP cũng được nêu rõ nhất. Tôi sẽ không sử dụng phương pháp đó bởi vì như bạn nói, điều này chỉ khó hiểu/đọc cho người mới bắt đầu ... Và tôi không thể đảm bảo những người sẽ duy trì nó sau khi tôi có kinh nghiệm :). – Romain

+0

Tôi không chắc chắn nếu tôi muốn điều đó. Với việc tái cấu trúc nó thành phương thức 'private static', bạn có nguy cơ mất sự giám sát. Thực hành bình thường là những loại phương pháp (phương pháp tiện ích) được đặt ở dưới cùng của lớp. Nhưng OK, ngày nay bạn có IDE để bạn có thể chỉ cần nhấp vào phía trước. – BalusC

Các vấn đề liên quan