new String()
- это запах кода - он почти всегда не нужен из-за неизменности String
. Если экземпляр String
имеет значение, этот экземпляр никогда не будет иметь другого значения.
В следующем методе new String()
является избыточным:
public static String string( final String string ) {
return new String( string.toLowerCase() );
}
toLowerCase()
возвращает новый (другой) экземпляр String
- new String()
здесь не делает ничего полезного, кроме как вызывает создание другого объекта, имеющего точное значение String
экземпляра, возвращенного toLowerCase()
Вот небольшой скрипт Groovy, показывающий концепцию (надеюсь - обратите внимание, это Java под языком сценариев):
String a = 'CamelCase'
String b = a.toLowerCase()
println "a='${a}'"
println "b='${b}'"
производства
a='CamelCase'
b='camelcase'
Обратите внимание, что a
не изменился - он неизменен; b
- это новое значение String
.
То же самое верно для BigDecimal.movePointLeft()
или любого другого метода в BigDecimal
, который возвращает BigDecimal
- это новые экземпляры, оставляя исходный экземпляр без изменений.
ОК, теперь ответим на ваш вопрос:
Наличие набора операций для Strings
, которые выполняют полезную задачу в вашем приложении, - хорошая идея. Использование фабрики, вероятно, не обязательно для чего-то вроде String
, но может быть для другого неизменного класса, который требует определенных усилий для создания.
В случае, когда невозможно расширить базовый класс, например String
, класс static method
s, как описано @kgiannakakis, вполне подходит.
В противном случае, если «неизменяемый» класс является частью приложения, где у вас есть доступ к объявлению / определению класса, методы, возвращающие новый экземпляр в модели BigDecimal
, String
и т. Д., Будут предпочтительнее. По сути, это то, что сказали @ Эрик Хесселинк, @ Бруно Конде и @reallyinsane.