Строки Java: "String s = new String (" глупо ");" - PullRequest
84 голосов
/ 02 декабря 2008

Я парень C ++, изучающий Java. Я читаю Эффективную Java и что-то меня смутило. Он говорит, что никогда не писать код, подобный этому:

String s = new String("silly");

Потому что он создает ненужные String объекты. Но вместо этого это должно быть написано так:

String s = "No longer silly";

Хорошо, пока хорошо ... Однако, учитывая этот класс:

public final class CaseInsensitiveString {
    private String s;
    public CaseInsensitiveString(String s) {
        if (s == null) {
            throw new NullPointerException();
        }
        this.s = s;
    }
    :
    :
}

CaseInsensitiveString cis = new CaseInsensitiveString("Polish");
String s = "polish";
  1. Почему первое утверждение в порядке? Разве это не должно быть

    CaseInsensitiveString cis = "Polish";

  2. Как мне заставить CaseInsensitiveString вести себя как String, чтобы вышеприведенное утверждение было в порядке (с расширением String и без него)? Что такого в String, которое позволяет просто передавать такой литерал? Насколько я понимаю, в Java нет понятия "конструктор копирования"?

Ответы [ 23 ]

0 голосов
/ 02 декабря 2008

В Java синтаксис «текст» создает экземпляр класса java.lang.String. Назначение:

String foo = "text";

- это простое назначение, без конструктора копирования.

MyString bar = "text";

Недопустимо, что бы вы ни делали, потому что класс MyString не является ни java.lang.String, ни суперклассом java.lang.String.

0 голосов
/ 16 июня 2015

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

Строки - это сложные данные, которые просто «действуют» как примитивные данные. Строковые литералы на самом деле являются объектами, хотя мы притворяемся, что они являются примитивными литералами, такими как 6, 6.0, 'c', и т. Д. Таким образом, строковый "литерал" "text" возвращает новый объект String со значением char[] value = {'t','e','x','t}. Поэтому звоню

new String("text"); 

на самом деле сродни звонку

new String(new String(new char[]{'t','e','x','t'}));

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

Для справки, вот реализация String: http://www.docjar.com/html/api/java/lang/String.java.html

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

Еще один хороший справочник - руководство по Java для строк: http://docs.oracle.com/javase/tutorial/java/data/strings.html

0 голосов
/ 02 декабря 2008

Во-первых, вы не можете создать класс, который выходит из String, потому что String - последний класс. И Java управляет строками не так, как другие классы, поэтому только с помощью String вы можете делать

String s = "Polish";

Но в вашем классе вы должны вызывать конструктор. Итак, этот код в порядке.

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