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); } }
If you want to keep you icons as static constants, I would extract the instantiation of the ImageIcon objects into a static method;
This way you have control whenever something fail, and you don’t have to repeat yourself in the instantiation.
Also, I would make the constants final.
A more general approach could be to use reflection to inspect your Icons-class and load resources for each public static Icon field in the class. This way, you would only have to declare a new Icon constant, and the corresponding resource would be loaded automatically based on the name of the constant. Leave a comment if you want more tips for doing this.