创建不可变对象,在没有new的情况下实例化

mat*_*hew 16 java string object instance

我可以创建一个只使用=运算符实例化的String类,就像类一样吗?或者这是StringJava中特定于类的功能?

u32*_*i64 16

不,您不能创建仅使用=运算符实例化的类,因为您不能像在C++或C#中那样使用Java重载运算符(请参阅Java中的运算符重载).

String"something"仅当内存中尚不存在时才会实例化s ,因此String每次编写时都会获得对同一对象的引用"something".

例如,如果你这样做:

String a = "something";
String b = "something";
Run Code Online (Sandbox Code Playgroud)

然后

a == b; // will be true.
Run Code Online (Sandbox Code Playgroud)

您可以查看此问题以了解有关String对象如何工作的更多信息:


Man*_*nns 14

由于Java不支持用户定义的运算符重载,因此无法使用=Operator 创建新实例.

查看为什么Java不提供运算符重载?欲获得更多信息


Jak*_*lák 7

代码String s = "Hello World!"不会创建新的String.它将String字符串池中现有的引用分配给s.如果String字符串池中不存在,则会String在字符串池中创建新对象,但不能=单独使用运算符.

这创造了新的String目标:

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

System.out.println(s1 == s2); // false
Run Code Online (Sandbox Code Playgroud)

这可能会也可能不会String在String Pool中创建一个新对象:

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

System.out.println(s1 == s2); // true
Run Code Online (Sandbox Code Playgroud)

你可以使用getInstance()模式非常接近上面提到的行为,考虑这个:

public class Singleton {
  private Singleton(){}

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

  public static Singleton getInstance() {
    return SingletonHelper.INSTANCE;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

Singleton s = Singleton.getInstance();
Run Code Online (Sandbox Code Playgroud)

  • 第一个代码片段不一定在字符串池中创建一个新的`String`(由`new String(...)`创建的字符串不包含在池中). (3认同)

归档时间:

查看次数:

1984 次

最近记录:

9 年,1 月 前