首页 > 解决方案 > 不应在数组实例上调用“hashCode”和“toString”(SonarLint)

问题描述

我通过 SonarLint 传递我的代码,我遇到了这个 linter 违规: "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);    
}

我应该如何更改我的代码以满足 linter 的要求,为什么?

标签: javaarrayssonarlint

解决方案


实际答案

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]

Linter 规则假定开发人员实际上想要数组的可读输出(考虑其元素),并建议您使用Arrays.toString()执行此操作的方法(如文档中所述)。

同样,Arrays.hashCode()在散列中考虑给定数组的元素(如文档中所述)。

b)确定性
(根据@andi-turner 的建议)

Arrays实用程序的方法在构造字符串/计算哈希时仅考虑元素。当使用由相同序列中的相同字符串(或另一种类型的值)组成的输入数组时,您将始终得到相同的字符串/哈希值。yourArray.toHashcode()或者yourArray.toString()不给你。


推荐阅读