На долговечность статических строк против, казалось бы, локальных строк в Java - PullRequest
0 голосов
/ 07 октября 2009

Учитывая следующий фрагмент A

private static final String SQL = "SELECT * FROM TABLE WHERE ID = ?";

и фрагмент B

public List<MyObject> getData(final Long id){
    return (List<MyObject>)template.query("SELECT * FROM TABLE WHERE ID = ?",id);
}

и фрагмент C

public List<MyObject> getData(final Long id){
    return (List<MyObject>)template.query(SQL,id);
}

Являются ли B и C одинаковыми? Моя строка в B получает gc'd (молодое поколение?), Потому что она имеет локальную область видимости?

Ответы [ 3 ]

2 голосов
/ 07 октября 2009

Строковые константы всегда интернированы . Каждый раз, когда вы вызываете фрагмент B, он будет использовать один и тот же строковый объект. По сути это эквивалент фрагмента A + C.

Действительно, две строковые константы, имеющие одинаковую последовательность символов, также будут использовать ссылки на одну и ту же строку:

String x = "a" + "b";
String y = "ab";

System.out.println(x == y); // true
1 голос
/ 08 октября 2009

И B, и C используют одно и то же строковое значение, поскольку все строки по сути "кэшируются" JVM. Они существуют в памяти столько, сколько им нужно.

Использование B или C зависит от читабельности кода (и удобства сопровождения). Подход B дает преимущество в том, что строка запроса SQL непосредственно примыкает к коду, использующему его результаты, поэтому не должно быть никаких сомнений относительно того, что запрос находится в точке его использования.

Подход C предпочтителен, если вы используете одну и ту же строку SQL-запроса во многих местах, что позволяет вам определить строку один раз для всего класса (или даже пакета). Если вам когда-либо придется менять его везде, где он используется, вам нужно всего лишь изменить это определение.

1 голос
/ 07 октября 2009

Нет. Ни B, ни C не создают String. String будет создан при загрузке кода (если он еще не существует как интернированный String). Это будет сборщик мусора вместе с остальной частью кода (если нет другой ссылки на тот же экземпляр String).

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