2008-12-15 7 views
5

Tôi có một số biểu tượng được sử dụng trong suốt một ứng dụng - hãy lấy biểu tượng ok/cancel làm ví dụ. Tại thời điểm này họ có thể là một đánh dấu và một cây thánh giá (tick.png, cross.png) nhưng tôi có thể muốn thay thế chúng trong tương lai. Ngoài ra, tôi muốn giữ đường dẫn tài nguyên ở một nơi.Hằng số biểu tượng Java - Hằng số tĩnh có ổn không?

là ok này:

public class Icons { 
    public static Icon OK = new ImageIcon(Icons.class.getResource("/icons/tick.png"); 
    public static Icon CANCEL = new ImageIcon(Icons.class.getResource("/icons/cross.png"); 
} 

Hoặc tôi nên làm điều này một cách khác nhau? Tôi không quan tâm dựa vào sự tồn tại của tập tin hình ảnh trong thời gian chạy kể từ khi họ đang ở .jar

Giải pháp

Tôi đã sử dụng ý tưởng Bent cho khởi động, và tôi đã thực hiện các hằng số final:

public final class Icons { 
    private static final Logger logger = Logger.getLogger(Icons.class); 

    public static final Icon OK = icon("/icons/add.png"); 
    public static final Icon CANCEL = icon("/icons/cancel.png"); 

    private static Icon icon(String path) { 
     URL resource = Icons.class.getResource(path); 
     if(resource==null) { 
      logger.error("Resource "+path+" does not exist"); 
      return new ImageIcon(); 
     } 
     return new ImageIcon(resource); 
    } 
} 
+0

OK và CANCEL phải thuộc loại Icon chứ không phải ImageIcon. Không cần phải trưng ra ImageIcon như một phần của hợp đồng công khai của nó. –

+0

Điểm tốt - Đó là những gì tôi nhận được để nhập ví dụ để nhanh chóng! Sửa lỗi – Draemon

Trả lời

1

Nếu bạn muốn giữ cho bạn biểu tượng dưới dạng hằng số tĩnh, tôi sẽ trích xuất các đối tượng ImageIcon thành một phương thức tĩnh;

public static final Icon ok = icon("ok.png"); 


private static Icon icon(String path) { 

    URL resource = Icons.class.getResource("/icons/" + path); 
    if (resource == null) { 
     // Log something... 
     return null; 
    } 
    return new ImageIcon(resource); 
} 

Bằng cách này bạn có thể kiểm soát bất cứ khi nào có điều gì đó không thành công và bạn không phải lặp lại bản thân trong quá trình khởi tạo.

Ngoài ra, tôi sẽ làm cho các hằng số cuối cùng.

Một cách tiếp cận tổng quát hơn có thể là sử dụng sự phản chiếu để kiểm tra lớp biểu tượng của bạn và tải tài nguyên cho từng trường Biểu tượng tĩnh công khai trong lớp. Bằng cách này, bạn sẽ chỉ phải khai báo một hằng số Biểu tượng mới và tài nguyên tương ứng sẽ được tải tự động dựa trên tên của hằng số. Để lại nhận xét nếu bạn muốn biết thêm mẹo để thực hiện việc này.

+0

Tôi thích điều này, mặc dù a) Nó có lẽ nên trả lại Icon không ImageIcon, b) Có thể tốt hơn để trả về một biểu tượng trống thay vì null. – Draemon

+0

Phản ánh? Kinh quá. enum sẽ tốt hơn. Nếu chúng ta có "enum trừu tượng" sẽ hữu ích. –

2

Bạn có thể muốn đánh dấu các hằng số là cuối cùng.

+0

Và chính lớp biểu tượng? – Draemon

0

Điều đó có vẻ là một cách khá dễ dàng để thực hiện điều đó. Mặc dù tôi sẽ đặt tên cho các hình ảnh có cùng tên với tên của chúng ("ok.png", "cancel.png"). Và đảm bảo rằng rõ ràng việc xóa hoặc đổi tên hình ảnh có thể gây ra sự cố.

3

tôi thấy hai vấn đề với điều đó, cả hai có thể được chấp nhận:

  1. Nó sẽ được khó khăn để gỡ lỗi nếu các biểu tượng không được tìm thấy hoặc không thể được nạp đối với một số lý do. Mã chạy trong các trình khởi tạo tĩnh có thể phức tạp, bởi vì nó dễ bị "loại bỏ" ngoại lệ.
  2. Lớp học có thể sẽ không bao giờ được bốc dỡ và do đó tài nguyên được sử dụng bởi các biểu tượng sẽ không bao giờ được giải phóng.

Số 1 có thể chấp nhận được nếu bạn có thể đảm bảo rằng các biểu tượng luôn ở đó và thậm chí có thể được làm việc xung quanh bằng cách đặt khởi tạo trong khối khởi tạo tĩnh và thêm xử lý ngoại lệ tốt và ghi nhật ký.

Số 2 có thể chấp nhận được vì biểu tượng thường được sử dụng trong toàn bộ thời gian chạy của ứng dụng và chúng sẽ không được giải phóng lâu trước khi thoát ứng dụng.

Vì vậy, tất cả trong tất cả tôi muốn nói đó là tốt.

0

Điều này có vẻ là cách làm tiêu chuẩn, nhưng tôi đã có vấn đề với trước đây.

Nếu bạn đang sử dụng Eclipse với Maven và lưu trữ các biểu tượng này trong thư mục tài nguyên của maven, khi Eclipse thực hiện một trong các bản dựng tự động của nó, nó sẽ không sao chép các tệp biểu tượng vào thư mục đích/lớp của bạn. Điều này sẽ gây ra một ngoại lệ thời gian chạy khi nó không thể tìm thấy các biểu tượng.

Bạn phải tự làm một gói maven ít nhất một lần để có được các biểu tượng ở đúng vị trí.

+0

Tôi không sử dụng (hoặc thích) Eclipse hoặc Maven, vì vậy đây không phải là vấn đề. Đây là một vấn đề công cụ anyway, vì vậy tôi muốn được nghiêng để sửa chữa các công cụ nếu tôi đã chạy vào một cái gì đó như thế này. Mẹo hữu ích mặc dù. – Draemon