2010-10-05 38 views
19

Tôi đang phát triển một ứng dụng Android và tôi rất mới trên Java và Android.Hằng số Java tập tin

Tôi muốn tạo một số hằng số để sử dụng trong một số hoạt động. Tôi có thể xác định các hằng số này ở đâu?

Cảm ơn.

Trả lời

45

Nó được coi là xấu thực hành trong java, và hầu hết các ngôn ngữ OO, để xác định một lớp đơn giản để giữ hằng số. Tốt hơn là xác định các hằng số trong một lớp mà chúng được liên kết với. Thường thì có một. ví dụ.

interface MyComponent { 
    /** The default height for a component */ 
    public static final int DEFAULT_HEIGHT = 5; 
    // other stuff 
} 

Nếu thực sự không có ai cảm thấy tự do để xác định một lớp riêng biệt.

EDIT: Những điều quan trọng ở đây là:

  1. Tận dụng tối hằng dễ tìm. Nếu có một vị trí 'tự nhiên' để đặt chúng, hãy đặt chúng ở đó (tức là chiều cao mặc định cho các đối tượng Thành phần thuộc về lớp Thành phần).
  2. Không có khớp nối cao hơn mức bạn cần. Đặt tất cả các hằng số của bạn vào một lớp 'Constants' làm cho khớp nối cao, đặc biệt khi các công cụ sửa đổi tiếp theo có xu hướng đặt tất cả các hằng số trong lớp Constants, cho dù có một lớp khác mà chúng có thể được đặt tự nhiên hay không.
  3. Chỉ vì hằng số được sử dụng bởi nhiều hơn một lớp không có nghĩa là nó phải nằm trong lớp 'Constants'. Nếu hằng số được sử dụng bởi 'Ứng dụng' và các lớp sử dụng lớp Ứng dụng thì hãy đặt nó trong lớp Ứng dụng. Bằng cách đó bạn không tăng khớp nối.
+0

thú vị, tôi chỉ đọc các biến và hằng số không nên ở bên trong giao diện để có thể đọc mã. Tôi đồng ý với điều đó, bởi vì tôi nghĩ rằng việc đặt tên tốt và một lớp 'Constants' tốt hơn nhiều, bởi vì hầu hết các hằng số sẽ được sử dụng trong các lớp khác nhau. Nếu bạn sử dụng hằng số để "định cấu hình" ứng dụng, thì cũng tốt để có bất kỳ thứ gì ở một nơi – WarrenFaith

+3

Các biến không thể ở bên trong giao diện. Các hằng số nên được, tôi tin rằng, nếu chúng có liên quan đến tất cả các lớp thực hiện giao diện. Nếu hằng số của bạn được sử dụng bởi tất cả các lớp thì có, đặt chúng trong một lớp Constants (như tôi đã nói ở trên). Nếu chúng được sử dụng để định cấu hình ứng dụng thì có thể chúng thuộc về lớp Ứng dụng. Điều quan trọng là làm cho chúng dễ tìm, và không có sự liên kết cao với bất kỳ lớp nào. Một lớp Constants có xu hướng rất cao nếu nó không được chăm sóc cẩn thận. – DJClayworth

18

Thông thường, bạn muốn sử dụng một lớp Constants, hoặc xác định chúng trong các lớp học, nơi chúng được sử dụng, a la:

class Constants { 
    public static final int NUM_TRIANGLES = 4; 
    public static final String SOME_TEXT = "This is a constant"; 
} 

Sau đó, bạn muốn giới thiệu cho họ bởi:

String inst = Constants.SOME_TEXT; 
+8

Tôi biết bạn chỉ hiển thị các ví dụ, nhưng tôi muốn nhấn mạnh rằng bạn không nên sử dụng CONST_ làm tiền tố cho các hằng số. ALL_CAPS là cách tiêu chuẩn để chỉ ra một hằng số. –

+0

Bạn cũng có thể biến nó thành giao diện thay vì một lớp học. –

+0

Phải, nó chỉ là một ví dụ, và có lẽ gợi nhớ đến nền tảng của người hỏi nếu anh ta đến từ C/C++ (đó là cảm giác tôi đã nhận ra câu hỏi). – billjamesdev

0

Bạn có thể định nghĩa một số hằng số trong các liệt kê Java.

Một điều tra viên Java đơn có thể chứa nhiều trường dữ liệu liên quan.

Oracle cung cấp this introduction to Java enumerations.

+5

Truy cập các điều tra viên hoạt động khá chậm, so với các biến cục bộ hoặc "tĩnh cuối cùng" (theo như tôi biết được biên dịch nội tuyến bởi trình biên dịch java). Ngoài ra Enumerators có một chi phí khá cao, khi nói đến bộ nhớ/không gian sử dụng. Xem http://developer.android.com/guide/practices/design/performance.html#avoid_enums – Tseng

7

Cách phổ biến nhất là tạo ra 'constants' trong lớp học là bạn cần họ:

class Example { 
    private static final int FILENAME = "test.txt; 
} 

Thay vì tin nó cũng có thể được khai báo default, bảo vệ hoặc của cộng đồng. Mặc dù nó được coi là một OO anti pattern để xác định hằng số là một lớp 'hằng số' (God) đặc biệt lưu trữ các hằng số cho toàn bộ ứng dụng. Ngoài ra, bạn cũng có thể lưu trữ dữ liệu cấu hình trong một Java properties file, điều này không được coi là chống mẫu.

Một tùy chọn khác, nhanh chóng trở nên phổ biến, là cách sử dụng mẫu Dependency Inject (DI). Thường thì mẫu này được sử dụng cho đối tượng phụ thuộc, nhưng nó cũng có thể được sử dụng để chèn các giá trị không đổi vào các đối tượng.Điều này có thể ví dụ được thực hiện với khuôn khổ Guice DI nhẹ của Google:

class Example { 
    String filename; 

    @Inject 
    public Example(@ConfigFilename String filename) { 
    this.filename = filename;   
    } 

Trong một lớp học đặc biệt Binder bạn sẽ ràng buộc một giá trị cho Strings chú thích với @ConfigFilename. Bằng cách này, bạn có khớp nối tối thiểu và các lớp học có thể được kiểm tra độc lập.

+0

Nếu tôi sử dụng tệp thuộc tính trên Android. Tôi có thể đặt nó ở đâu? – VansFannel

+0

Có một số cách, ví dụ như đọc tệp thuộc tính từ classpath (thư mục có các lớp): http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html – Kdeveloper

+0

Dagger cũng rất tuyệt vời https://github.com/square/dagger – Caipivara

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