WriteString

Zubastic

Бессмертный
Проверенный
Медаль за активность на Форуме
Сообщения
1 020
Розыгрыши
0
Репутация
1 243
Реакции
564
Баллы
1 655
Собственно создаю тему в данном разделе, но скорее не потому, что код, который будет представлен ниже дерьмо, нет, в целом он более чем нормален, однако его получение подтолкнуло меня к мысли о том, что программирование это достаточно увлекательная вещь, где задачу можно решить множеством способов.

Итак, я попросил 3х людей в скайпе реализацию WriteString. Точнее хотел я получить ее быстро, но отвечали все достаточно медленно и я просто уснул, а когда проснулся получил 3 реализации данного метода. В чем его суть: первые 2 байта это short - размер строки, затем идет по 2 байта на символ. Все достаточно просто. Ники авторов я специально указывать не буду.
1)
PHP:
 protected void writeString(CharSequence charSequence)
 {
  writeH(charSequence.length());
  writeS(charSequence);
  getByteBuffer().position(getByteBuffer().position() - 2);
 }
Тут все достаточно просто: пишем H, пишем S и затем убираем из буфера хвостик в 2 байта. Не самое оптимальное решение, по моему мнению, с точки зрения: добавим 2 байта и потом их еще отрежем.
2)
PHP:
 public void writeString(String value)
 {
  if (value != null)
  {
   _buf.writeShortLE(value.length());
   for (int i = 0; i < value.length(); i++)
   {
    _buf.writeChar(Character.reverseBytes(value.charAt(i)));
   }
  }
  else
  {
   _buf.writeShort(0);
  }
 }

Тут если честно я не совсем понимаю зачем проверять на null, если можно просто сделать длину строки равной 0, например вот так (яву знаю на уровне hello world, мб если null то вернется 0, пускай будет так):
PHP:
 public void writeString(String value)
 {
  int len = value == nul ? 0 : value.length();
   _buf.writeShortLE(len );
   for (int i = 0; i < len ; i++)
   {
    _buf.writeChar(Character.reverseBytes(value.charAt(i)));
   }
 }
Читаемость кода улучшится на порядок, да и простынки не будет.
3)
PHP:
  final int len = text.length();
   writeH(len);
   for (int i = 0; i < len; ++i)
   {
    getByteBuffer().putChar(text.charAt(i));
   }
Вот собственно то, о чем я говорил. Быстро и удобно.

А вы что думаете об этом?
 

    Mizuwokiru

    Баллов: 14
    За сообщение

Только вот если у тебя text == null, получишь NullPointerException при обращении к length().

Еще есть вариант с str.toCharArray() и последующей записи каждого char`а в буфер. И еще Сишный вариант - запись массива байтов напрямую str.getBytes("UTF-16LE").
 
Последнее редактирование:
Назад
Сверху Снизу