Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java icon constants - Are static constants ok?

I have a number of icons used throughout an application - let's take ok/cancel icons as an example. At the moment they might be a tick and a cross (tick.png, cross.png) but I may want to replace them in future. Also, I would like to keep the resource path in one place.

Is this ok:

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");
}

Or should I be doing this a different way? I don't mind relying on the existence of the image files at runtime since they're in the .jar

Solution

I've used Bent's idea for initialisation, and I've made the constants 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);
    }
}
like image 755
Draemon Avatar asked Dec 15 '08 18:12

Draemon


2 Answers

You may want to mark the constants as final.

like image 28
Markus Avatar answered Oct 07 '22 20:10

Markus


I see two problems with that, both might be acceptable:

  1. It will get hard to debug if your icons are not found or can't be loaded for some reasons. Code that runs in static initializers can be tricky, because it's easy to "loose" the exception.
  2. The class will probably never be unloaded and therefore the resource used by the Icons will never bee freed.

Number 1 is probably acceptable if you can make sure that the icons are always there and can even be worked around by putting the initialization in a static initializer block and adding good exception handling and logging.

Number 2 is probably acceptable since icons are usually used throughout the entire runtime of the application and they wouldn't be freed long before the application quits anyway.

So all in all I'd say that's fine.

like image 107
Joachim Sauer Avatar answered Oct 07 '22 18:10

Joachim Sauer