Константы значков Java - все ли в порядке? - PullRequest
5 голосов
/ 15 декабря 2008

У меня есть несколько значков, используемых во всем приложении - давайте возьмем в качестве примера значки ok / cancel. На данный момент они могут быть галочкой и крестиком (tick.png, cross.png), но я могу заменить их в будущем. Также я хотел бы сохранить путь к ресурсу в одном месте.

Это нормально:

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

Или я должен делать это по-другому? Я не против полагаться на существование файлов изображений во время выполнения, так как они находятся в .jar

Решение

Я использовал идею Бента для инициализации и сделал константы окончательными:

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

Ответы [ 5 ]

3 голосов
/ 15 декабря 2008

Я вижу две проблемы с этим, обе могут быть приемлемыми:

  1. Трудно будет отлаживать, если ваши иконки не найдены или не могут быть загружены по некоторым причинам. Код, который выполняется в статических инициализаторах, может быть сложным, потому что легко «потерять» исключение.
  2. Класс, вероятно, никогда не будет выгружен, и поэтому ресурс, используемый иконками, никогда не будет освобожден.

Номер 1, вероятно, приемлем, если вы можете убедиться, что значки всегда есть и их можно обойти, поместив инициализацию в статический блок инициализатора и добавив хорошую обработку исключений и ведение журнала.

Номер 2, вероятно, приемлем, поскольку значки обычно используются на протяжении всего времени выполнения приложения, и они не будут освобождены задолго до того, как приложение все равно закроется.

Так что в целом я бы сказал, что все в порядке.

2 голосов
/ 15 декабря 2008

Вы можете пометить константы как окончательные.

1 голос
/ 15 декабря 2008

Если вы хотите сохранить ваши значки в качестве статических констант, я бы выделил создание экземпляров объектов ImageIcon в статический метод;

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

Таким образом, вы можете контролировать каждый раз, когда что-то выходит из строя, и вам не нужно повторяться в процессе создания экземпляра.

Кроме того, я бы сделал константы окончательными.

Более общим подходом может быть использование отражения для проверки вашего класса Icons и загрузки ресурсов для каждого открытого статического поля Icon в классе. Таким образом, вам нужно будет только объявить новую константу Icon, и соответствующий ресурс будет загружен автоматически на основе имени константы. Оставьте комментарий, если вы хотите больше советов для этого.

0 голосов
/ 15 декабря 2008

Кажется, это стандартный способ работы, но у меня были проблемы с этим раньше.

Если вы используете Eclipse с Maven и храните эти значки в каталоге ресурсов maven, когда Eclipse выполняет одну из автоматических сборок, он не будет копировать файлы значков в каталог target / classes. Это приведет к исключению времени выполнения, когда он не может найти значки.

Вы должны сделать пакет maven вручную хотя бы один раз, чтобы иконки оказались в нужном месте.

0 голосов
/ 15 декабря 2008

Это довольно простой способ сделать это. Хотя я бы назвал изображения с тем же именем, что и для («ok.png», «cancel.png»). И убедитесь, что удаление или переименование изображений может вызвать проблемы.

...