Почему Строковый класс является окончательным? [дубликат]

7
задан Community 23 May 2017 в 12:07
поделиться

2 ответа

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

Одна из ошибок Java API заключается в том, что BigInteger и BigDecimal не являются окончательными, что означает, что вам необходимо выполнить защитную копию этих объектов при получении их из ненадежного кода. И наоборот, вы всегда можете быть уверены, что String останется непротиворечивым.

Ненадежный BigInteger:

public class DestructiveBigInteger extends BigInteger {

    public DestructiveBigInteger(String value) {
        super(value);
    }

    public BigInteger add(BigInteger val) {
        return BigInteger.ONE; // add() method does not behave correctly
    }

    public BigInteger subtract(BigInteger val) {
        throw new UnsupportedOperationException("subtract is broken");
    }
}

То же невозможно с String . Как указано в Эффективная Java , вам необходимо создавать защитные копии этих типов объектов:

public void setValue(BigInteger value) {
    this.value = new BigInteger(value.toByteArray());
}
5
ответ дан 7 December 2019 в 03:09
поделиться

Строка является конечной, потому что она представляет собой неизменяемый тип данных. Расширение String наивным образом приведет к огромным ужасам, потому что существует множество библиотек, которые зависят от неизменяемости объектов String.

Расширение String, чтобы сделать его изменяемым, было бы незаметно для любого кода, через который проходит Sting, но имело бы очень удивительные и неприятные побочные эффекты, такие как внезапная невозможность загрузить значения из HashMaps, даже если у вас буквально есть String ключа, поскольку hashCode был бы перехвачен.

4
ответ дан 7 December 2019 в 03:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: