2008-12-14 19 views
10

Trong java < 1.5, hằng sẽ được thực hiện như thế nàynên bạn luôn sử dụng enums thay vì hằng trong Java

public class MyClass { 
    public static int VERTICAL = 0; 
    public static int HORIZONTAL = 1; 

    private int orientation; 

    public MyClass(int orientation) { 
     this.orientation = orientation; 
    } 
... 

và bạn sẽ sử dụng nó như thế này:

MyClass myClass = new MyClass(MyClass.VERTICAL); 

Bây giờ, trong 1,5 rõ ràng bạn nên sử dụng enums:

public class MyClass { 
    public static enum Orientation { 
     VERTICAL, HORIZONTAL; 
    } 

    private Orientation orientation; 

    public MyClass(Orientation orientation) { 
     this.orientation = orientation; 
    } 
... 

và bây giờ bạn sẽ sử dụng nó như sau:

MyClass myClass = new MyClass(MyClass.Orientation.VERTICAL); 

Tôi thấy hơi xấu xí. Bây giờ tôi có thể dễ dàng thêm một vài biến tĩnh:

public class MyClass { 
    public static Orientation VERTICAL = Orientation.VERTICAL; 
    public static Orientation HORIZONTAL = Orientation.HORIZONTAL; 

    public static enum Orientation { 
     VERTICAL, HORIZONTAL; 
    } 

    private Orientation orientation; 

    public MyClass(Orientation orientation) { 
     this.orientation = orientation; 
    } 
... 

Và bây giờ tôi có thể làm điều này một lần nữa:

MyClass myClass = new MyClass(MyClass.VERTICAL); 

Với tất cả các loại an toàn tốt lành của sự đếm.

Đây có phải là kiểu tốt, kiểu xấu hay không. Bạn có thể nghĩ ra một giải pháp tốt hơn không?

Cập nhật

Vilx- là người đầu tiên để làm nổi bật những gì tôi cảm thấy tôi đã mất tích - rằng enum phải là một công dân hạng nhất. Trong java, điều này có nghĩa là nó nhận được tệp riêng của nó trong gói - chúng tôi không có các không gian tên. Tôi đã nghĩ rằng đây sẽ là một chút nặng, nhưng thực sự đã thực hiện nó, nó chắc chắn cảm thấy đúng.

Câu trả lời của Yuval là tốt, nhưng nó không thực sự nhấn mạnh đến enum không lồng nhau. Ngoài ra, đối với 1,4 - có rất nhiều nơi trong JDK sử dụng các số nguyên, và tôi đã thực sự tìm kiếm một cách để phát triển loại mã đó.

+0

Trong khối mã đầu tiên, bạn có nghĩa là cung cấp cho mỗi biến một giá trị khác nhau, phải không? –

+0

Bạn có thực sự cần lớp MyClass để làm nhiều hơn là chỉ các Định hướng khác nhau có thể làm được không? –

Trả lời

2

Không biết về Java, nhưng trong .NET thực hành tốt là đặt các enums song song với lớp sử dụng chúng, ngay cả khi nó được sử dụng bởi một lớp duy nhất. Nghĩa là, bạn sẽ viết:

namespace Whatever 
{ 
    enum MyEnum 
    { 
    } 
    class MyClass 
    { 
    } 
} 

Vì vậy, bạn có thể sử dụng:

MyClass c = new MyClass(MyEnum.MyValue); 
5

Bạn có biết bạn có thể nhập định hướng và nói

MyClass myClass = new MyClass(Orientation.VERTICAL); 

?

+0

Điểm tốt. Có, tôi đã làm, nhưng điều đó vẫn còn có nghĩa là độ dài hơn trong mã gọi (nó thêm một dòng nhập khẩu). Động lực của tôi là giữ mã gọi điện ngắn hơn và gọn gàng hơn. – Draemon

+0

Tôi xin lỗi, anh bạn. Ý tôi là, tôi yêu Java và tất cả, nhưng _shorter_ chưa bao giờ được ưu tiên trong ngôn ngữ này. –

+3

Ngắn hơn? Những gì ... vì vậy thay vì một dòng nhập khẩu bạn muốn viết MyClass hơn và hơn nữa? Đó không phải là ngắn hơn cũng không sạch hơn cho tôi. – arul

0

Nó phụ thuộc vào bao nhiêu giá trị enum có thể mất. Trong ví dụ của bạn, chỉ với hai, tôi sẽ chỉ sử dụng một boolean. Nếu enum sẽ chỉ được sử dụng bởi mã mà bạn viết và sẽ không phải tương tác với nhiều mã khác, có thể bạn không cần loại an toàn. Nhưng nếu nó trong một phương pháp 'công khai', tôi chắc chắn sẽ đi tìm enums, và đặt enum vào tập tin riêng của nó.

+0

Bạn có một điểm, nhưng bằng cách sử dụng enum là một chút tự mô tả sau đó chỉ là một boolean. –

+0

nhưng nếu bạn chỉ chuyển nó vào một hàm, thì bạn có thể tạo chữ ký 'công khai MyClass (boolean isVertical)'. Đó là về trường hợp duy nhất tôi sẽ sử dụng nó, mặc dù. –

27

Bạn phức tạp quá nhiều. Hãy mang tất cả lại với nhau.

bài Java 1.5 bạn nên sử dụng các lớp Java Enum:

public enum Color 
{ 
    BLACK, WHITE; 
} 

Pre Java 1.5 bạn nên sử dụng kiểu an Enum mẫu:

public class Color 
{ 
    public static Color WHITE = new Color("white"); 
    public static Color BLACK = new Color("black"); 

    private String color; 

    private Color(String s) 
    { 
     color = s; 
    } 
} 

Trong cả hai cách bạn gọi nó như vậy:

drawBackground(Color.WHITE); 

Cụ thể, liên quan đến câu hỏi của bạn. Đó là vấn đề về phong cách mã, nhưng tôi nghĩ cách ưu tiên là giữ bí mật trong các lớp riêng biệt của họ. Đặc biệt khi họ bắt đầu có các phương pháp riêng của họ như getName(), getId(), v.v ... Hãy nghĩ về nó như một tình thế khó xử như lớp thường lệ so với lớp ẩn danh, một khi lớp học bắt đầu lộn xộn, đã đến lúc chuyển nó ra tập tin.

0

Bạn cũng có thể có hai phương pháp tĩnh trên MyClass:

MyClass.Vertical() : MyClass 
MyClass.Horizontal() : MyClass 

Những sẽ trả về một đối tượng mới với bộ enum thích hợp.

0

Tôi đồng ý bạn sáng tạo nhưng tôi nghĩ đó không phải là giải pháp thiết thực và tôi nghĩ bạn chỉ cần chuyển "sự xấu xí" sang một phần khác của mã. Điều gì sẽ xảy ra nếu ngoài VERTICAL và HORIZONTAL, bạn cũng sẽ có DIAGONAL, AA, BB, CC, v.v.? Bạn sẽ phải sao chép bằng cách gõ mỗi và mọi hằng số tĩnh? Hương vị của bạn mà MyClass.Orientation.VERTICAL là xấu xí có thể là cá nhân?

+0

Tôi đồng ý rằng tôi vừa chuyển sự xấu xí, nhưng tôi luôn thích nó được gọi là mã như trái ngược với mã gọi. Nó hoàn toàn cá nhân, và tôi thậm chí không chắc chắn tôi thích sự thay thế, đó là lý do tại sao tôi yêu cầu các quan điểm. Tôi đang đi đến kết luận một lớp học riêng biệt sẽ là tốt nhất. – Draemon

0

Có một trường hợp quan trọng trong trường hợp bạn nên sử dụng hằng số thay vì enum s. Đây là khi bạn muốn làm số học bằng cách sử dụng các hằng số, hoặc so sánh chúng với các giá trị số. Sau đó, bạn thực sự cần một thứ là int, long hoặc double.

Ngược lại, nếu nó không bao giờ có ý nghĩa để so sánh số học hoặc số bằng cách sử dụng vật, vật đó phải là đối tượng chứ không phải là số nguyên thủy, do đó, enum sẽ phù hợp hơn.

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