ИЗМЕНИТЬ Спасибо за быстрые ответы. Посмотрите, каков настоящий вопрос. На этот раз я сделал это смело.
Я понимаю разницу между == и .equals. Итак, это не мой вопрос (я действительно добавил для этого контекст)
Я выполняю валидацию ниже для пустых строк:
if( "" == value ) {
// is empty string
}
В прошлом при извлечении значений из db или десериализации объектов из другого node этот тест не удалось, поскольку два экземпляра строк были действительно различными объектными ссылками, хотя они содержали одни и те же данные.
Таким образом, исправление для этих ситуаций было
if( "".equals( value ) ) {
// which returns true for all the empty strings
}
Я в порядке. Это понятно.
Сегодня это произошло еще раз, но это озадачило меня, потому что на этот раз приложение представляет собой очень маленькое автономное приложение , которое не использует сеть вообще, поэтому никаких новых строка извлекается из базы данных и десеризируется из другого node.
Итак, вопрос:
В условиях OTHER:
"" == value // yields false
и
"".equals( value ) // yields true
Для локального автономного приложения?
Я уверен, что новый код String() не используется в коде.
И единственный способ, которым может быть ссылка на строку, - это потому, что ему присваивается "" непосредственно в коде (или том, что я думал), как в:
String a = "";
String b = a;
assert "" == b ; // this is true
Как-то (после прочтения кода больше у меня есть ключ) были созданы две разные ссылки на пустые строковые объекты, я хотел бы знать как
Больше в строке ответа jjnguys:
Byte!
EDIT: Заключение
Я нашел причину.
После предложения jjnguy я смог смотреть с разными глазами на код.
Метод вины: StringBuilder.toString()
Новый объект String выделяется и инициализируется, чтобы содержать последовательность символов, представленную в данный момент этим объектом.
Doh!...
StringBuilder b = new StringBuilder("h");
b.deleteCharAt( 0 );
System.out.println( "" == b.toString() ); // prints false
Тайна решена.
В коде используется StringBuilder для обработки постоянно растущей строки. Оказывается, в какой-то момент кто-то сделал:
public void someAction( String string ) {
if( "" == string ) {
return;
}
deleteBankAccount( string );
}
и используйте
someAction( myBuilder.toString() ); // bug introduced.
p.s. Я читал слишком много CodingHorror в последнее время? Или почему я чувствую необходимость добавить некоторые забавные картины животных здесь?