Gdy „” == s jest fałszywe, ale „”) są prawdziwe
EDYTOWAĆ Dzięki za szybkie odpowiedzi. Zobacz, jakie jest prawdziwe pytanie. Tym razem odważyłem się.
Rozumiem różnicę między == i .equals. To nie jest moje pytanie (właściwie dodałem do tego jakiś kontekst)
Wykonuję poniższe sprawdzanie poprawności pustych ciągów:
if( "" == value ) {
// is empty string
}
wprzeszłość podczas pobierania wartości z bazy danych lub deserializacji obiektów z innego węzła, ten testnie powiodło się, ponieważ dwie instancje łańcuchowe były rzeczywiście różnymi odwołaniami do obiektów, chociaż zawierały te same dane.
Rozwiązaniem dla tych sytuacji było
if( "".equals( value ) ) {
// which returns true for all the empty strings
}
Pasuje mi to. To jest zrozumiałe.
Dzisiaj stało się to jeszcze raz, ale mnie to zdziwiło, ponieważ tym razem aplikacja jest bardzo małasamodzielna aplikacja to nie używasieć w ogóle, więc żaden nowy ciąg nie jest pobierany z bazy danych ani nie jest skanalizowany z innego węzła.
Więc pytanie brzmi:
"" == value // yields false
i
"".equals( value ) // yields true
W przypadku lokalnej aplikacji autonomicznej?
jestem prawie pewiennew String () nie jest używany w kodzie.
Jedynym sposobem, w jaki może być odniesienie do ciągu znaków, jest „”, ponieważ jest on przypisywany „” bezpośrednio w kodzie (lub tak mi się wydawało), jak w:
String a = "";
String b = a;
assert "" == b ; // this is true
Jakoś (po przeczytaniu kodu mam więcej wskazówek) powstały dwa różne odwołania do pustych obiektów, chciałbym to wiedziećw jaki sposób
Więcej w linii odpowiedzi jjnguys:
Bajt!
EDIT: Wniosek
Znalazłem powód.
Po jjnguy sugestii byłem w stanie spojrzeć innym okiem na kod.
Metoda winna: StringBuilder.toString ()
Nowy obiekt String jest przydzielany i inicjowany, aby zawierał sekwencję znaków aktualnie reprezentowaną przez ten obiekt.
Doh! ...
StringBuilder b = new StringBuilder("h");
b.deleteCharAt( 0 );
System.out.println( "" == b.toString() ); // prints false
Zagadka rozwiązana.
Kod wykorzystuje StringBuilder do radzenia sobie z coraz większym ciągiem znaków. Okazuje się, że w pewnym momencie ktoś:
public void someAction( String string ) {
if( "" == string ) {
return;
}
deleteBankAccount( string );
}
I użyć
someAction( myBuilder.toString() ); // bug introduced.
p.s. Czy ostatnio czytałem za dużo CodingHorror? A może czuję potrzebę dodania tutaj śmiesznych zdjęć zwierząt?