2013-08-29 39 views
5

Chúng tôi có một số dữ liệu trong tệp thuộc tính. Dữ liệu này được sử dụng trên nhiều lớp. Vì vậy, chúng ta tạo một đối tượng lớp Properties trong mỗi lớp và sau đó đọc dữ liệu bằng phương thức getProperty(). Điều này dẫn đến trùng lặp mã.Cách tránh đọc tệp thuộc tính nhiều lần

Ai đó có thể đề xuất một số phương pháp hay nhất để tránh điều này không?

Một điều mà đến tâm trí của tôi là:
Tạo một lớp
Có một biến công cộng cho mỗi tài sản trong tập tin tài sản trong lớp này
Có một phương pháp mà gán giá trị cho mỗi và mọi tài sản
Trong trong đó các giá trị thuộc tính được yêu cầu, tạo đối tượng cho lớp này và truy cập vào các biến công khai

Nhưng, những thứ tôi không thích với phương pháp này là biến công cộng và nếu tất cả thuộc tính mới được thêm vào tệp thuộc tính, tôi cần thêm mã để đọc thuộc tính đó trong lớp.

Mọi trợ giúp đều được đánh giá cao.

Cảm ơn bạn!

+1

Làm thế nào về ' –

+0

trùng lặp có thể tiếp cận Singleton' của [Hãy Java Thuộc tính sẵn trên lớp?] (Http://stackoverflow.com/questions/4750131/make-java-properties-available-over-classes) –

Trả lời

0

Một trong các tùy chọn hộp là sử dụng system properties. Bạn có thể thêm các thuộc tính hệ thống của riêng bạn vào môi trường thực thi của bạn.

0

Bạn có thể làm điều này với một lớp chuyên dụng có đối tượng Thuộc tính tĩnh. Xem here để biết ví dụ.

0

tôi có thể hiểu nhầm dữ liệu của bạn chảy ở đây, nhưng đây là những gì có vẻ "bình thường" với tôi:

  • Tạo một phương pháp readPropFile.
    • Điều này sẽ đọc một tệp và phân tích cú pháp các thuộc tính mà nó tìm thấy.
    • Các thuộc tính này có thể được lưu trữ trong một Map<String, Object>, được băm theo tên thuộc tính.
  • Đọc tệp thuộc tính một lần (có lẽ khi ứng dụng bắt đầu hoặc bất cứ khi nào thích hợp để tải thuộc tính) ->Properties đối tượng (ví dụ: props).
  • Vượt qua props xung quanh bất kỳ thứ gì cần quyền truy cập vào các thuộc tính đó.
    • Hoặc nếu bạn không muốn chuyển nó một cách rõ ràng, hãy sử dụng trình truy cập tĩnh như minh họa here.
  • Thuộc tính truy cập bằng cách sử dụng props.get("PROPERTY_NAME") (chỉ tìm kiếm thuộc tính đó trong nội bộ Map).
    • Nếu bạn không muốn sử dụng tra cứu chuỗi, bạn có thể giữ một tên thuộc tính hợp lệ ở đâu đó và lưu trữ/tra cứu bằng cách sử dụng, nhưng sau đó bạn phải cập nhật enum mỗi khi bạn thêm thuộc tính mới vào tệp.
+0

Cảm ơn, điều này cũng hữu ích – Austin

17

Bạn có thể tạo lớp Singleton, tải thuộc tính lần đầu tiên được gọi.và phương thức công khai truy lục giá trị thuộc tính, cho khóa thuộc tính đã cho ..

Giả sử bạn đang sử dụng tệp thuộc tính standart ... Nhưng bạn có thể ngoại suy điều này cho bất kỳ cặp khóa-giá trị nào, thay đổi loại thuộc tính với Bản đồ hoặc thứ gì đó khác.

Something như

public class PropertyHandler{ 

    private static PropertyHandler instance = null; 

    private Properties props = null; 

    private PropertyHandler(){ 
     // Here you could read the file into props object 
     this.props = ..... 
    } 

    public static synchronized PropertyHandler getInstance(){ 
     if (instance == null) 
      instance = new PropertyHandler(); 
     return instance; 
    } 

    public String getValue(String propKey){ 
     return this.props.getProperty(propKey); 
    } 
} 

Sau đó, bạn có thể gọi đây là cần thiết .. từ bất kỳ mã .. như thế này.

String myValue = PropertyHandler.getInstance().getValue(propKey); 

Hope this helps

+1

Nếu PropertyHandler sẽ được sử dụng từ nhiều hơn một thread, thì getInstance sẽ được đồng bộ hóa. –

+0

Bạn nói đúng ... cố định ... (Tôi đã viết điều này trên bay .. Tôi quên ...) –

+0

có, điều này đã giúp. Cảm ơn nhiều. Ngoài ra, nhờ tất cả những người khác đã trả lời. – Austin

0

Tôi đã thành công sử dụng một Enum, và trong các nhà xây dựng bằng cách sử dụng phương pháp name() để đọc một tài sản cùng tên. Hãy đảm bảo xử lý các ngoại lệ theo cách hợp lý hoặc nếu không toàn bộ lớp sẽ không tải được và bạn sẽ không nhận được thông báo lỗi hữu ích.

Lợi ích của phương pháp này là mỗi giá trị enum tự động tương ứng với thuộc tính mà không phải viết mã ánh xạ riêng lẻ cho từng thuộc tính. Tất nhiên bạn cần một giá trị enum cho mỗi thuộc tính (đó là không thể tránh khỏi nếu bạn muốn tham chiếu DRY), nhưng bạn tránh mã khởi tạo lặp lại cho mỗi thuộc tính bằng cách sử dụng các chuỗi không được kiểm soát. Hạn chế là enums không cho phép các loại generic, vì vậy nếu bạn muốn một số thuộc tính để trả về Integer và những thứ khác để trả về String, thì bạn có thể được phục vụ tốt hơn với một thiết kế class singleton cổ điển.

Nếu bạn muốn phát điên với điều này, bạn cũng có thể viết kịch bản để tạo mã nguồn Enum hoặc singleton java của bạn từ tệp thuộc tính, để giữ mã của bạn thêm DRY.

2

cho tôi lớp bên trong tĩnh là cách tốt nhất có thể để thực hiện. Nó sẽ làm điều đó một cách lười biếng, vì việc nạp lớp được đồng bộ hóa nên luồng an toàn, cộng với trình diễn cũng vậy. Vì vậy, với điều này, chúng tôi đang đạt được ba điều:

  1. hiệu suất tốt vì đồng bộ hóa sự sống sẽ bị ảnh hưởng, nhưng ở đây chúng tôi đang sử dụng lớp bên trong tĩnh.
  2. chủ đề an toàn vì khi lớp bên trong sẽ được tải hơn bản đồ duy nhất sẽ được khởi tạo khi lớp tải là chủ đề an toàn do đó tất cả tổng số chủ đề an toàn.
  3. Lớp bên trong sẽ được tải khi chúng tôi gọi số Singleton.initialize().get(key) để bản đồ được khởi tạo một cách lười biếng.

Dưới đây là mã ...

public class SingletonFactory 
{ 
    private static class Singleton 
    { 
     private static final Map<String, String> map = new HashMap<String, String>(); 
     static 
     { 
      try 
      { 
       //here we can read properties files 
       map.put("KEY", "VALUE"); 
      } 
      catch(Exception e) 
      { 
       //we can do the exception handling 
       System.out.println(e); 
      } 
     } 
     private static Map<String, String> initialize() 
     { 
      return map; 
     } 
    } 

    public static String getValue(String key) 
    { 
     return Singleton.initialize().get(key); 
    } 
} 
Các vấn đề liên quan