Enum.values()
дает ссылку на массив, и итерация по массиву перечислений стоит столько же, сколько итерация по массиву строк. Между тем, сравнение значений перечисления с другими значениями перечисления может на быстрее сравнивать строки со строками.
Между тем, если вас беспокоит стоимость вызова метода values()
по сравнению с уже имеющейся ссылкой на массив, не беспокойтесь. Вызов метода в Java (сейчас) невероятно быстрый, и всякий раз, когда это действительно имеет значение для производительности, вызов метода все равно будет встроен компилятором.
Так что, если серьезно, не беспокойтесь об этом. Вместо этого сконцентрируйтесь на удобочитаемости кода и используйте Enum
, чтобы компилятор поймал его, если вы когда-нибудь попытаетесь использовать постоянное значение, которое ваш код не ожидал справиться.
Если вам интересно, почему сравнения перечислений могут выполняться быстрее, чем сравнения строк, вот подробности:
Это зависит от того, были ли строки интернированы или нет. Для объектов Enum
всегда есть только один экземпляр каждого значения перечисления в системе, и поэтому каждый вызов Enum.equals()
может быть выполнен очень быстро, как если бы вы использовали оператор ==
вместо equals()
метод. На самом деле, с Enum
объектами безопаснее использовать ==
вместо equals()
, тогда как не безопасно делать со строками.
Для строк, если строки были интернированы, то сравнение выполняется так же быстро, как и для Enum
. Однако, если строки не были интернированы, то метод String.equals()
фактически должен обходить список символов в обеих строках до тех пор, пока одна из строк не закончится или не обнаружит символ, который отличается между двумя строками.
Но, опять же, это, вероятно, не имеет значения, даже в коде рендеринга Swing, который должен выполняться быстро. : -)
@ Бен Линс указывает, что Enum.values()
должен делать защитную копию, поскольку массивы изменчивы, и возможно, вы можете заменить значение в массиве, которое возвращается Enum.values()
. Это означает, что вы должны учитывать стоимость этой защитной копии. Однако копирование одного смежного массива, как правило, является быстрой операцией, если предположить, что он реализован «под капотом» с использованием некоторого вызова копирования из памяти, а не наивной итерации по элементам в массиве. Поэтому я не думаю, что это меняет окончательный ответ.