2011-06-26 29 views
9

Thực hành tốt khi xác định một điều kiện là gì?Thực hành Enum - Xác định bên trong một lớp học/riêng biệt, đặt công khai/riêng tư

Ví dụ: tôi có lớp Người. Đối với lớp học này, tôi đã chọn sử dụng một enum có các giá trị MALE và FEMALE.

Nếu enum được xác định bên trong lớp Person hoặc riêng biệt? Nếu enum được định nghĩa là riêng tư hay công khai? Ngoài ra, bạn có bất kỳ lời khuyên nào khác có thể sử dụng một enum linh hoạt nhất có thể không?

Trả lời

8

IMHO, đặt thành public static enum bên trong class Person.

Lý do là enum Gender chỉ áp dụng cho Người, vì vậy hãy đặt nó vào đó để chúng được liên kết với nhau (Giới tính không sử dụng được nếu không có ngữ cảnh của một người).

Ưu điểm:

  • ít lớp sưng lên
  • nếu bạn di chuyển này sang người khác gói/dự án, Giới tính sẽ luôn luôn đi kèm với nó
  • Person, ai là người sử dụng duy nhất, có "kiểm soát" của nó và có thể thay đổi nó như nó muốn, ví dụ như
    • thêm private List<HealthIssue> genderSpecificHealthIssues;
    • bổ sung thêm sự đếm, ví dụ như TRANSGENDER, 012., hoặc bất cứ điều gì

Nhược điểm duy nhất là bạn phải sử dụng một khẩu static để sử dụng nó, nghĩa là import static com.company.Person.Gender.*;.

Mẫu này được nhìn thấy trong nhiều lớp JDK, chẳng hạn như Calendar xác định nhiều hằng số liên quan đến ngày sử dụng bên trong lớp.

3

Để linh hoạt hoàn toàn, hãy thêm nó vào lớp tĩnh. Nhưng tất nhiên điều này chỉ là duy nhất cho các enums cần được sử dụng trong toàn bộ ứng dụng. Đối với các enums địa phương và chuyên ngành, tốt hơn là giữ chúng ở gần nơi chúng sẽ được sử dụng. Exampli gratia, tôi có một lớp IPHandler giúp xử lý, phân tích cú pháp và dịch địa chỉ IPv4 và IPv6 trong suốt cho người dùng lớp (IPHandler là một lớp tĩnh). Nó có một enum, IPType, với các giá trị IPv4 và IPv6 chỉ được sử dụng trong IPHandler cho một số hoạt động. Vì nó không được sử dụng ở bất cứ nơi nào khác, nó được định nghĩa trong lớp IPHandler.

+0

@leon: Cảm ơn bạn đã chia sẻ. Chỉ để xác nhận, IPType không được sử dụng trong setters/getters và được định nghĩa là riêng tư? –

+0

@James P. - vì phương thức gọi IPHandler sử dụng enum (như trong _IPHandler.getFormattedLocal (** IPHandler.IPType ipType **)) _, chúng phải được truy cập từ bên ngoài lớp cha của nó. Điều này có nghĩa là không, họ không thể được tư nhân - và không nên có setters. Java có cho phép điều đó không? – leon

+0

Ok, tôi nhận được bạn. Khi tôi đề cập đến getters và setters tôi có nghĩa là những người trong lớp IPHandler của bạn. Nó cần thiết để đặt enum là có thể truy cập công khai nếu chúng được tham chiếu trong các phương thức. Điều này khiến tôi băn khoăn trong trường hợp nào sẽ là một ý tưởng tốt để định nghĩa một enum như một tệp Java riêng biệt. P.S: Chỉ cần cho các chi tiết, enums có thể có biến/phương pháp được thêm vào mặc dù rõ ràng là không thể sửa đổi các giá trị enum thực tế. –

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