2017-08-14 118 views
16

Czy mogę utworzyć klasę, która tworzy instancje za pomocą tylko operatora =, na przykład klasy String? Czy jest to funkcja specyficzna dla klasy String w Javie?Utwórz niezmienny obiekt, utworzony bez nowego

+6

Nie, nie można. Jest to coś, co, jak powiedziałeś, "leży wewnątrz Javy". – sudo

+12

I łańcuchy są * nie * tworzone z '='.Stałe łańcuchowe są definiowane za pomocą '" ... "', a stamtąd staje się bardziej skomplikowane. Więc nie, nie możesz. Użyj 'new'. Jeśli nie podoba ci się 'new', możesz ukryć to za statyczną metodą fabularną lub coś podobnego. –

+0

https://stackoverflow.com/questions/2068570/how-to-create-a-string-class-replica – soorapadman

Odpowiedz

16

Nie, nie można utworzyć klasę, która jest instancję tylko z = operatora bo nie można przeciążać operatora w Javie jak można w C++ lub C# (patrz Operator overloading in Java).

String s są wystąpienia podczas korzystania "something" tylko wtedy, gdy nie istnieje w pamięci, więc można uzyskać odniesienie do tego samego obiektu dokładny String każdym razem piszesz "something".

Na przykład, jeśli zrobić:

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

Następnie

a == b; // will be true. 

Można spojrzeć na te pytania, aby dowiedzieć się więcej o tym, jak String obiekty działa:

7

Kod String s = "Hello World!" nie tworzy nowego String. Przypisuje on odniesienie do String istniejącego w Puli Ciągów do s. Jeśli String nie istnieje w Puli ciągów, to nowy obiekt String jest tworzony w Puli Ciągów, ale nie z samym operatorem =.

Stwarza to nowe String objecs:

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

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

To może lub nie może utworzyć nową String obiekt w łańcuchach Basen:

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

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

można dostać dość blisko do zachowania wspomnianej powyżej z wykorzystaniem getInstance() wzór, należy wziąć pod uwagę to:

public class Singleton { 
    private Singleton(){} 

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

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

Następnie można użyć:

Singleton s = Singleton.getInstance(); 
+3

Pierwszy fragment kodu niekoniecznie tworzy nowy ciąg 'String' w puli ciągów znaków (łańcuchy utworzone przez' new String (...) 'nie są zawarte w puli). – Nevay

+0

@Nevay Masz oczywiście rację, moja wina, poprawiłem moją odpowiedź. –