Есть ли какая-то выгода в обертывании `String` с` new String (...) `перед запуском его методов? - PullRequest
1 голос
/ 05 мая 2011

Я видел несколько старых фрагментов кода в программном обеспечении, которое никто не помнит, кто писал это вместо того, чтобы делать что-то вроде:

String abc = SOME_CONSTANT.toLowerCase()

Они делают:

String abc = new String(SOME_CONSTANT).toLowerCase()

Iне может видеть никакого значения в этом - похоже на простое плохое программирование (например, непонимание того, что String неизменна).Кто-нибудь может увидеть хорошую причину для этого?

Примечание: SOME_CONSTANT определяется как -

public static final String SOME_CONSTANT = "Some value";

Ответы [ 6 ]

4 голосов
/ 05 мая 2011

Нет, он просто создает больше объектов (если компилятор не оптимизирует его)

3 голосов
/ 05 мая 2011

Единственная точка в обёртывании строки внутри другой строки - принудительное копирование.например,

String str = "A very very log string .......";
// uses the same underlying string which we might not need after this.
String str1 = str.substring(0, 1); 
// take a copy of which only has one char in it.
String str2 = new String(str1);

Я бы просто сделал

public static final String SOME_CONSTANT = "Some value";
public static final String LOWER_CONSTANT = SOME_CONSTANT.toLowerCase();
3 голосов
/ 05 мая 2011

Нет веских причин.Как вы сказали, String является неизменяемым, поэтому при вызове toLowerCase() он всегда будет генерировать новую строку.

3 голосов
/ 05 мая 2011

Я согласен с вами: это плохое программирование

0 голосов
/ 05 мая 2011

Я не уверен, но я думаю, что когда вы используете new String(), вы заставляете JVM создать новый объект для этой строки.Если вы используете SOME_CONSTANT.toLowerCase(), JVM будет искать в пуле строк и просто делать ссылку, если есть такая же строка.

Может быть, использование new String() в этом случае может быть хорошей практикой, просто чтобы дать понять, чтоtoLowerCase() повлияет только на новую сгенерированную строку, а не на константу.

Но в любом случае, эффект тот же

0 голосов
/ 05 мая 2011
new String(someString)

имеет смысл только в одном важном случае:

String s = incredilyLongString.substring(1000,1005);
String t = new String(s);

Предположим, что incredilyLongString имеет длину 1000000 символов (например, файл XML), и вам нужно только 5 символов.String s по-прежнему будет занимать как минимум ОДИН МЕГАБАЙТ памяти, но String t будет создан с нуля и будет занимать только необходимую память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...