Наилучшим подходом является Long.valueOf(str)
, поскольку он опирается на Long.valueOf(long)
, который использует внутренний кэш, что делает его более эффективным, поскольку при необходимости он будет повторно использовать кэшированные экземпляры Long
переход от -128
к 127
включен.
Возвращает экземпляр Long
, представляющий указанное длинное значение.Если новый экземпляр Long не требуется, этот метод обычно следует использовать вместо конструктора Long(long)
, поскольку этот метод, вероятно, даст значительно лучшую производительность в пространстве и времени за счет кэширования часто запрашиваемых значений.Обратите внимание, что в отличие от соответствующего метода в классе Integer, этот метод не требуется для кэширования значений в определенном диапазоне.
Благодаря автоматическое удаление позволяя преобразовать экземпляр класса-обертки в соответствующий ему примитивный тип, код будет:
long val = Long.valueOf(str);
Обратите внимание, что предыдущий код все еще может выдать NumberFormatException
, если предоставленный String
несовпадать со знаком long
.
Вообще говоря, хорошей практикой является использование static
фабричного метода valueOf(str)
класса-оболочки, такого как Integer
, Boolean
, Long
,... поскольку большинство из них повторно используют экземпляры всякий раз, когда это возможно, делая их потенциально более эффективными с точки зрения использования памяти, чем соответствующие parse
методы или конструкторы.
Отрывок из Эффективная Java Item 1
, написанная Джошуа Блохом :
Вы часто можете избежать создания ненужных объектов, используя статические фабричные методы (пункт 1) предпочтительнее конструкторов на неизменяемых классах, которые обеспечивают оба.Например, метод статической фабрики Boolean.valueOf(String)
почти всегда предпочтительнее конструктора Boolean(String)
.Конструктор создает новый объект каждый раз, когда он вызывается, в то время как статический метод фабрики никогда не требует этого и на практике не будет.