2010-10-14 26 views
9

Để tránh các số ma thuật, tôi luôn sử dụng các hằng số trong mã của mình. Quay trở lại những ngày xưa, chúng tôi đã sử dụng để định nghĩa các bộ liên tục trong một giao diện không có phương thức mà bây giờ đã trở thành một antipattern.Thực hành tốt nhất cho các hằng số toàn cầu liên quan đến các số ma thuật

Tôi đã tự hỏi thực tiễn tốt nhất là gì? Tôi đang nói về các hằng số toàn cầu. Là một enum sự lựa chọn tốt nhất để lưu trữ các hằng số trong Java?

Trả lời

1

Sử dụng giao diện để lưu trữ hằng số là một số loại giao diện lạm dụng.

Nhưng việc sử dụng Enums không phải là cách tốt nhất cho từng trường hợp. Thường thì một đồng bằng int hoặc bất cứ điều gì khác liên tục là đủ. Xác định trường lớp riêng ("kiểu an enums") thậm chí còn linh hoạt hơn, ví dụ:

public abstract class MyConst { 
    public static final MyConst FOO = new MyConst("foo") { 
    public void doSomething() { 
     ... 
    } 
    }; 

    public static final MyConst BAR = new MyConst("bar") { 
    public void doSomething() { 
     ... 
    } 
    }; 

    protected abstract void doSomething(); 

    private final String id; 

    private MyConst(String id) { 
    this.id = id; 
    } 

    public String toString() { 
    return id; 
    } 
    ... 
} 
+0

làm thế nào linh hoạt hơn enums? chúng cũng có thể có các phương thức cụ thể không đổi (các phương thức trừu tượng mà mỗi thực thể liên tục thực hiện). –

4

Vâng. Enum là sự lựa chọn tốt nhất.

Bạn đang nhận được miễn phí:

  • hằng
  • đối tượng bất biến
  • độc thân

Tất cả trong một.

Nhưng hãy đợi, còn một số thông tin khác. Mỗi giá trị enum có thể có các trường và phương thức riêng của nó. Đó là một đối tượng liên tục phong phú với hành vi cho phép chuyển đổi thành các hình thức khác nhau. Không chỉ toString, nhưng toInt, toWhateverDestination bạn cần.

+3

Và đây là hướng dẫn về cách sử dụng Enums làm hằng số http://download.oracle.com/javase/1.5.0/docs/guide/language/enums.html – Joel

2

Enum là tốt nhất cho hầu hết các trường hợp, nhưng không phải tất cả mọi thứ. Một số có thể được đặt tốt hơn như trước đây, đó là trong một lớp học đặc biệt với hằng số tĩnh công cộng.

Ví dụ nơi enum không phải là giải pháp tốt nhất là cho các hằng số toán học, như PI. Tạo một enum cho điều đó sẽ làm cho mã tồi tệ hơn.

enum MathConstants { 
    PI(3.14); 

    double a;   

    MathConstants(double a) { 
     this.a = a; 
    } 

    double getValueA() { 
     return a; 
    } 
} 

Cách sử dụng:

MathConstants.PI.getValueA(); 

Ugly không phải là nó? So sánh với:

MathConstants.PI; 
29

Đối với con số kỳ diệu nơi con số thực tế có một ý nghĩa và không chỉ là một nhãn bạn rõ ràng là không nên sử dụng enums. Sau đó, phong cách cũ vẫn là tốt nhất.

public static final int PAGE_SIZE = 300; 

Khi bạn chỉ ghi nhãn nội dung bạn sẽ sử dụng enum.

enum Drink_Size 
{ 
    TALL, 
    GRANDE, 
    VENTI; 
} 

Thỉnh thoảng bạn nên đặt tất cả các hằng số toàn cục trong lớp của riêng mình, nhưng tôi muốn đặt chúng vào lớp mà chúng gắn liền với nhau nhất. Điều đó không phải lúc nào cũng dễ xác định, nhưng vào cuối ngày, điều quan trọng nhất là mã của bạn hoạt động :)

+1

Sự phân biệt sạch đẹp ở đây cho mỗi khi được sử dụng tốt nhất – Brian

0

Quên về enums - bây giờ, khi nhập tĩnh có sẵn trong Java, hãy đặt tất cả các hằng số của bạn vào REAL lớp (thay vì giao diện) và sau đó chỉ cần nhập các thành viên tĩnh từ tất cả các thành viên khác sử dụng import static <Package or Class>.

+0

Bạn có thể làm rõ lý do tại sao chúng ta nên "quên đi enums" và giải thích tại sao bạn muốn nhập các hằng số từ các lớp khác một cách tĩnh? – allingeek

+0

1. Câu hỏi về số ma thuật. Số đếm không tốt cho các con số so với hằng số chuẩn - xem câu trả lời của @nanda ở trên. 2. Hơn nữa, liệt kê là quyết định xấu xí khi bạn phải lưu trữ một tập hợp các hằng số kiểu khác nhau. 3. Enums ban đầu được giới thiệu như một container cho _series_ của các phần tử. Điều này có nghĩa là liệt kê mô tả một bộ đơn vị logic: tháng, ngày trong tuần, hành tinh, màu cầu vồng, v.v. và nó là một cách giải quyết để sử dụng enums cho hằng số để tránh các 'giao diện hằng số' chống mẫu. Bây giờ nó không được yêu cầu nữa - chúng tôi có nhập khẩu tĩnh thay thế. –

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