«hashCode» и «toString» не должны вызываться для экземпляров массива (SonarLint) - PullRequest
0 голосов
/ 23 октября 2018

Я передаю свой код через SonarLint, и я столкнулся с этим нарушением линтера: "hashCode" and "toString" should not be called on array instances.

Это мой код:

byte[] lblobPic;
lblobPic = r.get(PEOPLE.PPIC);
if (lblobPic != null) {
    String argStr = lblobPic.toString();
    peopleDto.setUrlPic(argStr);
}

SonarLint дает следующий фрагмент кода какподсказка для улучшения моего кода:

public static void main( String[] args )  {
    String argStr = Arrays.toString(args);
    int argHash = Arrays.hashCode(args);    
}

Как мне изменить свой код, чтобы он соответствовал линтеру и почему?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018
String argStr = lblobPic.toString();

должно быть лучше

String argStr = Arrays.toString(lblobPic);

, поскольку исходный Object.toString даст загадочный шестнадцатеричный адрес.

Однако, чего вы хотите достичь, сохраняя байты как String,no-go в java, так как java использует Unicode для String и char (два байта, UTF-16), всегда с преобразованием (предполагаемой кодировки текста этих байтов).

Иногда такие байты кодируются в Base64:

byte[] lblobPic = r.get(ALUNO.PFOTO);
if (lblobPic != null) {
    String argStr = Base64.getUrlEncoder().encode(lblobPic);
    peopleDto.setUrlPic(argStr);
}

Еще лучше предоставить поле byte[] в DTO.


Если дальнейшая обработка будет проблемой;существует вложение изображений.

Как (обычный) Base64 может использоваться для HTML со встроенным изображением:

    String argStr = Base64.getEncoder().encode(lblobPic);
    String html = "<img src="data:image/jpeg;base64," + argStr + "\" alt=\"\">";

(здесь предполагается JPEG.)

0 голосов
/ 23 октября 2018

Фактический ответ

SonarLint предлагает вам вместо вызова toString() для экземпляра массива, а лучше использовать метод утилиты Arrays.

Он предлагает вам изменить код на что-то вроде следующего:

byte[] lblobPic;
lblobPic = r.get(ALUNO.PFOTO);
if (lblobPic != null) {
    String argStr = Arrays.toString(lblobPic);
    peopleDto.setUrlPic(argStr);
}

Причина ответа

a) Удобочитаемость для людей

Рассмотрим следующий фрагмент кода:

String[] strings = { "foo", "bar", "bla", "boo" };

System.out.println(strings.toString());
// prints: [Ljava.lang.String;@7852e922 

System.out.println(Arrays.toString(strings));
// prints: [foo, bar, bla, boo]

Правило Линтера предполагает, что разработчик действительно хочет читаемый вывод массива (с учетом его элементов), и предлагает вам использовать Arrays.toString()метод, который делает это (как описано в документации ).

Аналогично, Arrays.hashCode() рассматривает элементы данного массива в хешировании (как описано в документация ).

b) Детерминизм
(согласно предложению @ andi-turner)

Методы утилиты Arrays, учитывают только элементы при построениистрока / вычисление хэша.Вы всегда будете иметь одну и ту же строку / хэш, если будете использовать входной массив, состоящий из одинаковых строк (или значений другого типа) в той же последовательности.yourArray.toHashcode() или yourArray.toString() не дает вам этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...