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
Odpowiedz
Ponieważ Java nie obsługuje zdefiniowany przez użytkownika Operator Przeciążenie nowa instancja nie może być utworzony z =
Operatora.
Wyjazd Why doesn't Java offer operator overloading? więcej informacji
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:
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();
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
@Nevay Masz oczywiście rację, moja wina, poprawiłem moją odpowiedź. –
Nie, nie można. Jest to coś, co, jak powiedziałeś, "leży wewnątrz Javy". – sudo
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. –
https://stackoverflow.com/questions/2068570/how-to-create-a-string-class-replica – soorapadman