Как бороться с Final Strings? - PullRequest
       0

Как бороться с Final Strings?

5 голосов
/ 16 января 2011

Есть ли какое-либо преимущество в создании String as final или мы можем сделать String as final? Я понимаю, что поскольку String является неизменяемым, нет смысла делать его окончательным, это правильно, или это ситуация, когда кто-то захочетсделать String as Final?

код:

private final String a = "test";

or 

private String b = "test";

Ответы [ 6 ]

10 голосов
/ 16 января 2011

final означает, что ссылка никогда не может измениться.String неизменность означает нечто иное;это означает, что при создании String (значение, а не ссылка, т.е. «текст») его нельзя изменить.

Например:

String x = "Strings Are ";
String s = x;

Теперь s иx оба ссылаются на одно и то же String.Однако:

x += " Immutable Objects!";
System.out.println("x = " + x);
System.out.println("s = " + s);

Это напечатает:

x = Strings Are Immutable Objects
s = Strings Are

Это доказывает, что любой созданный String не может быть изменен, и когда любое изменение действительно происходит, создается новый String.

Теперь для final, если мы объявим x как final и попытаемся изменить его значение, мы получим исключение:

final String x = "Strings Are ";
x += " Immutable Objects!";

Вот исключение:

java.lang.RuntimeException: Uncompilable source code - cannot assign a value to final variable x
4 голосов
/ 16 января 2011

final означает, что ссылка не может измениться, а не значение. Независимо от финала, Строки всегда неизменны.

final String a = "test";
String b = "hello";

a = "world"; // error, a can't change reference to the String object "world"
b = "two"; // ok, b points to a different String object "two"
4 голосов
/ 16 января 2011

Это означает, что переменная никогда не может даже указывать на другую строку.

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

(редактировать - в вашем примере выне назвала вашу переменную ...

final String x = "test";

)

1 голос
/ 16 января 2011

final означает, что переменная не может быть изменена.

final String s = "abcd";
// later in the code
s = "efgh";  // This will not compile

Неизменяемый означает, что в String есть метод, который может изменить его содержимое, например, setter, append и т. Д.

0 голосов
/ 16 января 2011

Одно из отличий в наличии конечного поля состоит в том, что поскольку строка String является неизменной, она также может быть статической.

private final String a = "test";

немного более эффективно, возможно, более ясно, как

private static final String a = "test";
0 голосов
/ 16 января 2011

Здесь все хорошо, но есть еще два способа " иметь дело с финальными строками ", как вы выразились, но с точки зрения "где их разместить":

  1. Создайте интерфейс, включающий конечные статические переменные (и конечные строки), и реализуйте его там, где они вам нужны, и
  2. Создайте класс для констант и выполните статический импорт.

Способ 1, был популярен около 10 лет назад, и, возможно, все еще там, где у вас есть большие коллекции конечных переменных. Способ 2 прост в использовании, но немного странен, поскольку вы можете ссылаться на константы без квалификации, что затрудняет понимание вашего кода.

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