2010-09-02 28 views
7

Theo công cụ PMD, sau đây là một thói quen xấu:Thêm một chuỗi trống vs toString - tại sao nó xấu?

String s = "" + 123; // bad 
String t = Integer.toString(456); // ok 


This is an inefficient way to convert any type to a `String`. 

Tại sao nó là một điều xấu để làm gì?

+0

Rõ ràng, đối với hằng số (tĩnh/cuối cùng) "" + 123 hiệu quả hơn. Đối với các giá trị khác, sử dụng toString là hiệu quả hơn. – corgrath

+0

"Tĩnh/cuối cùng" có thể gây hiểu nhầm. Một trường phải là _both_ tĩnh và cuối cùng được coi là một hằng số, và chỉ cho các kiểu nguyên thủy và chuỗi. (Biến cục bộ không bao giờ được coi là hằng số.) –

+0

có thể trùng lặp của [Chuyển đổi thành Chuỗi sử dụng ("" + ) thực hành không đúng?] (Http://stackoverflow.com/questions/1572708/is-conversion-to-string- sử dụng-int-value-bad-practice) – McDowell

Trả lời

10
String s = "" + 123; // bad  
String t = Integer.toString(456); 

sẽ được biên dịch để:

String s = "123"; 
String t = Integer.toString(456); 

vậy: "" 123 là rõ ràng tốt hơn một chút! Checked với JAD

public static void main(String args[]) 
{ 
// 0 0:ldc1   #16 <String "123"> 
// 1 2:astore_1 
// 2 3:sipush   456 
// 3 6:invokestatic #18 <Method String Integer.toString(int)> 
// 4 9:astore_2 
// 5 10:getstatic  #24 <Field PrintStream System.out> 
// 6 13:new    #30 <Class StringBuilder> 
// 7 16:dup 
// 8 17:aload_1 
// 9 18:invokestatic #32 <Method String String.valueOf(Object)> 
// 10 21:invokespecial #38 <Method void StringBuilder(String)> 
// 11 24:aload_2 
// 12 25:invokevirtual #41 <Method StringBuilder StringBuilder.append(String)> 
// 13 28:invokevirtual #45 <Method String StringBuilder.toString()> 
// 14 31:invokevirtual #48 <Method void PrintStream.println(String)> 
// 15 34:return 
} 

EDIT:

Đối với giá trị không đổi:

int i = 123; 
String s = (new StringBuilder()).append(i).toString(); 
String t = Integer.toString(i); 
System.out.println((new StringBuilder(String.valueOf(s))).append(t).toString()); 

    public static void main(String args[]) 
    { 
    // 0 0:bipush   123 
    // 1 2:istore_1 
    // 2 3:new    #16 <Class StringBuilder> 
    // 3 6:dup 
    // 4 7:invokespecial #18 <Method void StringBuilder()> 
    // 5 10:iload_1 
    // 6 11:invokevirtual #19 <Method StringBuilder StringBuilder.append(int)> 
    // 7 14:invokevirtual #23 <Method String StringBuilder.toString()> 
    // 8 17:astore_2 
    // 9 18:iload_1 
    // 10 19:invokestatic #27 <Method String Integer.toString(int)> 
    // 11 22:astore_3 
    // 12 23:getstatic  #32 <Field PrintStream System.out> 
    // 13 26:new    #16 <Class StringBuilder> 
    // 14 29:dup 
    // 15 30:aload_2 
    // 16 31:invokestatic #38 <Method String String.valueOf(Object)> 
    // 17 34:invokespecial #44 <Method void StringBuilder(String)> 
    // 18 37:aload_3 
    // 19 38:invokevirtual #47 <Method StringBuilder StringBuilder.append(String)> 
    // 20 41:invokevirtual #23 <Method String StringBuilder.toString()> 
    // 21 44:invokevirtual #50 <Method void PrintStream.println(String)> 
    // 22 47:return 
    } 
+1

Tôi không chắc chắn tôi đang theo dõi bạn. Bạn có chứng minh rằng "" +123 tốt hơn Integer.toString (123) không? – corgrath

+0

+1 để thực sự kiểm tra. Bây giờ những gì về các loại đối tượng hơn là các loại pod? –

+0

Các loại nhóm là gì? – corgrath

6

Nó mở rộng thành "" + String.valueOf (yourObject) và do đó thực hiện một kết nối không cần thiết. Việc ghép nối liên quan đến việc phân bổ chuỗi thừa và thực hiện thêm một bản sao giá trị của chuỗi.

+5

và phiên bản chuỗi ngắn gọn nêu rõ ý định. "Chuyển đổi giá trị này thành chuỗi" –

+1

Điều này không hoàn toàn chính xác từ quan điểm tạo mã, vì vậy tôi sẽ không từ bỏ upvoting. Nó thực sự (đối với Java 6u20, mà tôi đã thử nghiệm với) mở rộng thành: 'new StringBuilder(). Append (" "). Append (yourObject) .toString()', giả định rằng 'yourObject' không phải là hằng số. –

20

Đó là không hiệu quả, vì nó liên quan đến một chuỗi không cần thiết nối, do đó việc tạo ra một hoặc hai đối tượng String bổ sung - mặc dù tôi tin rằng JIT có thể tối ưu hóa nó đi.

Đối với tôi, vấn đề lớn hơn là mã ít rõ ràng hơn. Gọi toString là một thành ngữ tiêu chuẩn, dễ hiểu đối với mọi nhà phát triển Java (hy vọng :-), vì vậy bạn nên thích điều này.

+3

Tính minh bạch của mã là điều quan trọng đối với tôi. – Bart

+3

Độ rõ ràng của mã phải luôn đi trước khi tối ưu hóa vi mô. – JesperE

0
String s = "" + 123; // bad 

Đoạn mã trên tạo ra một chuỗi tạm thời, kết hợp "" và 123

+2

Không đơn giản như vậy. Xem câu trả lời của stacker. Nếu thay vì 123 bạn có giá trị không đổi, thì bạn sẽ chính xác. –

Các vấn đề liên quan