Помните глупый опыт — неизменяемость строк

Java Java EE

предисловие

Только лысая голова может стать сильнее.

Текст был включен в мой репозиторий GitHub, добро пожаловать, звезда:GitHub.com/Zhongf UC очень…

Запишите глупую операцию при написании кода, точки знаний, связанные с этой статьей: неизменность строк

I. Предыстория

У меня есть система, которая предоставляет интерфейс RPC для отправки текстовых сообщений. Чтобы вызвать мой интерфейс извне, вам нужно передать такие параметры, как номер мобильного телефона.Я отвечаю за анализ этих параметров, выполнение некоторой бизнес-обработки, а затем вызов интерфейса провайдера канала SMS для отправки SMS-сообщений.

Всякий раз, когда вызывается интерфейс провайдера СМС-канала, я буду хранить запись, отправленную на этот раз (хранить ее в MySQL), аналогично, провайдер СМС-канала будет возвращать мне квитанцию ​​об отправке или отказе, и я также буду хранить ее ( сохранить его в MySQL).

В этот день ко мне кто-то пришел и сказал, что на определенный номер мобильного телефона не могут приниматься смс, а пользователь не блокирует смс (задолженность, отключение) и другие операции, но не может получать смс.

Итак, я отправился на разведку.Во-первых, я пошел в БД, чтобы узнать, существует ли соответствующая запись об отправке, и обнаружил, что эта запись существует, и я не мог увидеть ничего необычного в БД.

  • Следовательно, это исключает случай перехвата этой операции на середине (поскольку она была сохранена, должен был быть вызван интерфейс оператора СМС)

Позже я зашел в журналы, чтобы посмотреть, какая информация об объекте «Результат», возвращенном при вызове оператора SMS, а затем я пошел спросить оператора SMS, в чем может быть причина этой проблемы. Ответ был: "Если это происходит с некоторыми номерами мобильных телефонов, нет ли обрезки для вашего номера телефона?"

Итак, я пошел снова искать журнал и обнаружил, что после номера мобильного телефона был пробел (это было душераздирающе, я никогда не видел его раньше). Бороться с этой проблемой очень просто, мне достаточно подрезать номер телефона в подъезде.

2. Напишите код

я здесь, чтобы поддержатьОтправляйте одно и то же SMS на несколько мобильных номеров, поэтому номер мобильного телефона, который я использую здесь, — это HashSet для получения. Чтобы обрезать номер телефона, я написал следующий код:

// 说明:Task对象 有个 key属性,这个key属性的类型是HashSet

if (task.getKey() != null && task.getKey().size() > 0) {
    for (String s : task.getKey()) {
        s.trim();
    }
}

Код очень прост, я делаю два шага:

  • Судя по тому, является ли он нулевым, если не нулевым, просмотрите коллекцию номеров мобильных телефонов.
  • Обрезать каждый номер телефона

Что-то не так с кодом выше? Должна быть проблема, нет проблемы, что еще можно написать.

Напишите небольшое демо ниже, мы найдем: вызов на 11 строке кодаtrim()После метода, выводимого в строке 12, еще будут пробелы.

代码示例

2.1 Почему существует такая иллюзия?

На самом деле, когда мы впервые изучаем Java, мы обязательно изучим класс String. При обучении также понятно, что StringнеизменныйДа, но всегда есть ощущение, что мы изменили объект String, почему?

不可变的String

Я думаю, что первый момент заключается в следующем: мы часто оперируем изменчивыми объектами, и если какие-то свойства объекта меняются, мы думаем, что они изменились. Например следующий код:

HashSet<Student> students = getStudent();
for (Student s1 : students) {
    s1.setName("Java3y");
}

После выполнения мы думаем, что имя Student в HashSet было изменено на Java3y, что на самом деле так.

Я думаю, что второй момент является это: когда мы обычно работаем строковые объекты, мы напрямую проходим результат операции, которая выглядит как изменение исходного объекта. Например, код как следующее:

// 去重
String phone = "   137888888888    ";
sendPhone(phone.trim());

// 转成大写后输出
System.out.println(phone.toUpperCase());

// ... 等等

返回一个新的String对象

2.2 Как изменить

Теперь, когда проблема известна, объекты String неизменяемы, и при работе с объектами String «кажется» изменение исходного объекта String, но на самом деле генерируется новый объект String.

Вернемся к моей проблеме, ее тоже очень легко решить, поставьтеtrimХороший номер телефона может быть установлен на HashSet

// 说明:Task对象 有个 key属性,这个key属性的类型是HashSet

HashSet<String> hs = new HashSet();
if (task.getKey() != null && task.getKey().size() > 0) {
    for (String s : task.getKey()) {
        hs.add(s.trim());
    }
}
task.setKey(hs);

Наконец

Этот B написал статью, чтобы объяснить, как он «разумно» написал ошибку, бессовестно.

рад вывестигалантерейные товарыОбщедоступный номер технологии Java:Java3y. В публичном аккаунтеБолее 200 оригинальных статейТехнические статьи, обширные видеоресурсы, красивые карты мозга,Следуйте, чтобы получить его!

转发到朋友圈是对我最大的支持!

Я думаю, что моя статья хорошо написана, нажмитеотличный!