java - 不应在数组实例上调用“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 的要求,为什么?
解决方案
实际答案
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()
不给你。