2012-07-08 34 views
14

Tôi đã đọc the docs và nhận thấy nó. Không bao giờ tưởng tượng nó. Mô tả:Phương thức toString() của String có bất kỳ mục đích thực tế nào không?

Đối tượng này (đã là một chuỗi!) Tự nó được trả lại.

Bên cạnh đó điền ước hoặc sử dụng tài nguyên máy tính, những gì hiện một .toString() trong Java làm trên một String rằng việc sử dụng các String bản thân sẽ không? Tại sao nó không chỉ đơn giản là kế thừa các .toString() từ lớp java.lang.Object?

EDIT:

Tôi hiểu rằng trong những tình huống đa hình một phương pháp riêng toString() đã tồn tại kể từ khi nó gạt mẹ của toString(). Những gì tôi muốn biết trong câu hỏi đầu tiên là nếu có bất kỳ tình huống nào bạn sẽ nhận được điều gì đó khác biệt giữa việc sử dụng stringVariable/"String value" và sử dụng stringVariable.toString()/"String value".toString().

Ví dụ: gr .: Một hoạt động đầu ra như System.out.println(stringVariable.toString()); hoặc gán giá trị như stringVariable = "String value".toString();.

+0

Xin chào! Trong trường hợp bạn không nhìn thấy nó sau khi đình chỉ của bạn được dỡ bỏ, có một bình luận từ JohnDoDo về câu trả lời của Jon. FWIW, nếu bạn quay trở lại, vui lòng xem xét khôi phục tất cả các câu trả lời không được chấp nhận - nếu họ đủ tốt để chấp nhận vào thời điểm đó, những người hữu ích đó sẽ bị phạt vì một sự kiện ngoài tầm kiểm soát của họ. – halfer

Trả lời

34

Bên cạnh việc thực hiện các quy ước hoặc sử dụng tài nguyên máy tính, một .toString() trong Java thực hiện trên chuỗi sử dụng chính chuỗi đó sẽ không làm gì?

Điều đó có nghĩa là nó mang lại kết quả phù hợp khi được gọi là đa hình.

Tại sao nó không đơn giản thừa hưởng .toString() từ lớp java.lang.Object?

Vì điều đó sẽ không mang lại kết quả tương tự, và gần như chắc chắn không phải kết quả mong muốn.

Object.toString() có nghĩa là cung cấp một biểu diễn chuỗi hữu ích hợp lý của đối tượng. Việc triển khai Object cung cấp thông tin về loại và giá trị có thể được sử dụng cho các gợi ý nhận dạng thô (chẩn đoán hữu ích, nhưng đó là tất cả). Rõ ràng là không phải là biểu diễn chuỗi hữu ích nhất cho chuỗi - chính chuỗi đó là.

Trong khi tôi sẽ nói rằng đó là một điều đáng tiếc rằng toString được định nghĩa trong khá một cách len (đó là chưa rõ liệu kết quả là có nghĩa là cho máy, nhà phát triển ngừơi tiêu dùng tiêu thụ), nó cảm thấy rõ ràng với tôi rằng một String sẽ trả lại chính nó trong việc thực hiện.

+5

Mục Java hiệu quả 10 thảo luận một số lý do để tránh chỉ định đầy đủ 'toString()': bởi vì ai đó sẽ _inevitably_ quyết định nên phân tích cú pháp nó là một ý tưởng hay. –

+1

@TrevorTrovalds: Tài liệu đã trả lời chưa? Nó trả về "đối tượng này" - vì vậy không, không có trường hợp nào khi sử dụng 'foo' và' foo.toString() 'sẽ cho kết quả khác khi' foo' là tham chiếu không null tới 'Chuỗi'. –

+2

@TrevorTrovalds: Um, ish - mặc dù tôi * sẽ không * sử dụng nó cho mục đích đó. –

0

Thực hiện phương thức toString trong java được thực hiện bằng cách ghi đè phương thức của Object. Phương thức java toString() được sử dụng khi chúng ta cần một biểu diễn chuỗi của một đối tượng. Nó được định nghĩa trong lớp Object. Phương pháp này có thể được ghi đè để tùy chỉnh biểu diễn String của Object.

0

ví dụ thực tiễn:

public abstract class MetadataProcessor { 

protected void processMetadata() {  
    Map<String, Object> metadata = getMetadata(); 
    for(String key : metadata.keySet()) { 
     if(metadata.get(key) instanceof Date) { 
     processDate(metadata.get(key)); 
    } else { //String or any other object type 
     processString(metadata.get(key).toString()); 
    } 
} 

private void processDate(Date date) { 
    (...) 
} 

private void processString(String string) { 
    (...) 
} 

/** 
* contains document's metadata, values must be String or Date 
**/ 
protected abstract Map<String, Object> getMetadata(); 
} 

Nếu Chuỗi của.toString() sẽ không trả về String, cần thêm if(foo instanceof String) ở mã trên.

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