Создавать неизменяемый объект, созданный без новых

Можно ли создать класс, созданный с помощью только оператора =, как это делает класс String? Или это функция, специфичная для класса String в Java?

Ответы

Ответ 2

Нет, вы не можете создать класс, созданный только с помощью оператора =, потому что вы не можете перегружать оператор в Java, как вы можете, на С++ или С# (см. Перегрузка оператора в Java).

String создаются при использовании "something" только в том случае, если он еще не существует в памяти, поэтому вы получаете ссылку на тот же самый точный объект String каждый раз, когда вы пишете "something".

Например, если вы выполните:

String a = "something";
String b = "something";

Тогда

a == b; // will be true.

Вы можете взглянуть на эти вопросы, чтобы узнать больше о том, как работают объекты String:

Ответ 3

Код String s = "Hello World!" не создает новый String. Он присваивает ссылку String, существующей в пуле строк, на s. Если String не существует в String Pool, тогда в String Pool создается новый объект String, но не только оператор =.

Это создает новые объекты String objecs:

String s1 = new String("Hello World!"); // new Object
String s2 = new String("Hello World!"); // new Object

System.out.println(s1 == s2); // false

Это может создать или не создать новый объект String в String Pool:

String s1 = "Hello World!";
String s2 = "Hello World!";

System.out.println(s1 == s2); // true

Вы можете приблизиться к описанному выше поведению с использованием шаблона getInstance(), рассмотрите это:

public class Singleton {
  private Singleton(){}

  private static class SingletonHelper{
    private static final instance INSTANCE = new Singleton();
  }

  public static Singleton getInstance() {
    return SingletonHelper.INSTANCE;
  }
}

Затем вы можете использовать:

Singleton s = Singleton.getInstance();