簡體   English   中英

不應在數組實例(SonarLint)上調用“ hashCode”和“ toString”

[英]“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM