[英]“hashCode” and “toString” should not be called on array instances (SonarLint)
我正在通過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);
}
我應該如何更改代碼以滿足要求,為什么?
實際答案
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()
在哈希中考慮給定數組的元素(如docoumentation中所述 )。
b)確定性
(根據@ andi-turner的建議)
Arrays
實用程序的方法在構造字符串/計算哈希時僅考慮元素。 當使用由相同序列(或其他類型的值)組成的輸入數組時,您將總是以相同的字符串/哈希結束。 yourArray.toHashcode()
或yourArray.toString()
不會為您提供。
String argStr = lblobPic.toString();
最好是
String argStr = Arrays.toString(lblobPic);
因為原始的Object.toString將給出一個神秘的十六進制地址。
但是,要實現的目標是將字節存儲為String在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);
}
最好在DTO中提供byte[]
字段。
如果進一步處理有問題; 存在圖像嵌入。
如何(正常)將Base64用於帶有嵌入式圖像的HTML:
String argStr = Base64.getEncoder().encode(lblobPic);
String html = "<img src="data:image/jpeg;base64," + argStr + "\" alt=\"\">";
(此處假定為JPEG。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.