2009-02-19 36 views
10

Bên cạnh tất nhiên, việc sử dụng chúng với nguyên thủy. Hầu hết (nếu không phải tất cả) các triển khai tôi thấy chỉ hữu ích từ quan điểm của lập trình viên.ToString() chỉ hữu ích để gỡ lỗi?


EDIT: Tôi hiểu rằng tôi phải ghi đè lên hành vi mặc định, đó là lý do tại sao tôi đã đề cập việc triển khai :). Và tôi nhận được giá trị của việc ghi đè nó trong một số thành phần đòi hỏi một biểu diễn String bên trong một GUI. Tuy nhiên, trong JDK ít nhất, tôi thấy các triển khai chỉ đến để sử dụng bất cứ khi nào bạn cần gỡ lỗi các phiên bản đối tượng.

Tại sao nó bắt nguồn từ lớp Object, vì điều đó chỉ có vẻ hữu ích cho các công cụ GUI/gỡ lỗi? có sử dụng nào khác mà tôi không biết?

+1

Nhắm mục tiêu các câu hỏi để nhiều ngôn ngữ là ràng buộc để có được kết quả khác nhau dựa trên các thông lệ được chấp nhận của ngôn ngữ đó. – Robin

Trả lời

12

toString() hữu ích bất cứ khi nào bạn muốn biểu diễn chuỗi của đối tượng. Đương nhiên điều đó xảy ra cho mục đích gỡ lỗi, nhưng cũng có thể hợp lệ cho kết quả đầu ra của các hoạt động cho người dùng. Ví dụ:

Ví dụ: giả sử bạn có một lớp Complex xử lý các số phức.Nếu bạn muốn in chúng ra cho người dùng theo định dạng như 3 + 2i, sẽ rất tiện lợi nếu họ xác định toString() vì bạn không phải viết định dạng mỗi lần và đầu ra sẽ nhất quán. Nếu bạn muốn thay đổi biểu diễn đó, ví dụ: 3 + 2j, bạn chỉ cần chạm vào phương thức toString() trong lớp Complex.

Vì vậy, toString() cũng không dành cho mục đích gỡ lỗi, nhưng là cách tốt để có được các biểu diễn chuỗi nhất quán về các đối tượng của bạn.

+0

Thật vậy, nhưng không có gì đảm bảo rằng 'biểu diễn chuỗi nhất quán' nào cả. –

+0

Tôi có một lớp FooFile với FooFileSections. Để viết tệp, tôi chỉ ghi đè ToString cho chính tệp đó: FooFile.ToString() cũng như cho từng phần tệp: FooFileSections.ToString(). sau đó tôi xây dựng các nội dung tập tin bằng cách gọi ToString trong trình tự đúng cho các FooFileSections, sau đó chỉ cần dòng ra văn bản. Có lẽ không phải là một cách tốt tổng thể, nhưng nhanh chóng và dễ dàng. –

+0

"kết quả đầu ra của hoạt động cho người dùng". Vì văn bản 'toString()' không được quốc tế hoá, nên việc sử dụng văn bản nói chung là hữu ích cho người dùng. – Raedwald

17

Không, điều quan trọng là bạn phải ghi đè cài đặt mặc định ToString() để làm cho nó hữu ích. ToString() có thể là một cách tuyệt vời để xuất ra giá trị của một cái gì đó trở lại giao diện người dùng.

Ví dụ đơn giản là nếu bạn có một lớp Tên với ba chuỗi (Đầu tiên, Giữa, Cuối cùng). Bạn có thể có phương thức ToString() định dạng nó cho giao diện người dùng: Ví dụ: "Last, First Middle".

Hoặc một lớp lưu trữ phép toán (giá trị Left = 2, Right = 3, Result = 6 và toán tử enum = Multiply). Gọi ToString() để nhận "2 * 3 = 6".

Tuy nhiên, có thể phổ biến hơn để có nhiều phương thức To<qualifier>String() khác nhau, như lớp .NET DateTime. (ToShortDateString(), ToLongDateString(), ToLongTimeString() ...)

Edit: Đối với lý do tại sao nó được bắt nguồn từ ở lớp Object, nó đơn giản chỉ vì ToString() là một hoạt động hợp lệ cho bất cứ điều gì . Ngoài ra, chuỗi có thể là một cách tốt để phối hợp giữa các kiểu dữ liệu hoặc người tiêu dùng dữ liệu, bởi vì nó (thực tế) được bảo đảm có thể phân tích cú pháp và không yêu cầu mã hóa hoặc chăm sóc thêm.

+0

Theo dõi rất đầy đủ. Tôi chỉ nghĩ rằng các công cụ ghi nhãn GUI cho toString() bị lạm dụng. Tại sao không phải là một cái gì đó như 'thực hiện giao diện TextualRepresentation' hoặc một cái gì đó như thế? –

+0

Tôi đồng ý rằng đó là một hoạt động hợp lệ cho mọi thứ, nhưng chỉ từ quan điểm lập trình viên. Quan điểm của tôi là không có bất kỳ hợp đồng nào để xác định rằng phương thức nên cung cấp các chuỗi giao diện thân thiện với GUI hoặc phơi bày các nội bộ cụ thể của các cá thể (các trường), chỉ hữu ích cho các lập trình viên, IMHO –

+3

Thường xấu cho các mục đích giao diện người dùng, vì nó không lấy ngôn ngữ người dùng. Không quan trọng cho việc gỡ lỗi, không quan trọng đối với người dùng cuối. – MSalters

0

ToString() cũng được gọi bởi Khuôn khổ .NET ngầm khi in bất kỳ đối tượng nào ra một chuỗi.

Console.WriteLine("My Object is" + object.ToString()); 

tương đương với

Console.WriteLine("My Object is" + object); 

vì ToString() được mặc nhiên được gọi.

Tôi tin rằng, mặc dù không chắc chắn, rằng nó được sử dụng bởi trình gỡ rối cho "giá trị" của một đối tượng. Điều này có thể khá tiện dụng, mặc dù có giới hạn. Trong hầu hết các trường hợp, trình soạn thảo trình gỡ lỗi của riêng bạn sẽ là một ý tưởng tốt hơn.

+0

Trình gỡ lỗi có thể gọi ToString() đối với một số đối tượng nhưng không phải tất cả, như được evinced theo Danh sách nơi đầu ra trình gỡ lỗi hữu ích hơn nhiều cho đầu ra của ToString(). – jwg

0

Trên AS3, tôi phải chuyển đổi mảng 2D thành mảng 1D. Giải pháp nhanh nhất (chạy tốc độ) và dễ nhất (mã hóa thời gian) là:

var new1DArray:Array = the2DArray.toString().split(","); 

Hãy ngạc nhiên nhưng nó thực sự hoạt động như dự định và khá nhanh!

1

hữu ích cho

  1. Gui (tài sản phức tạp khi bạn sử dụng PropertyGrid, Mẫu tiêu đề văn bản)
  2. DataBinding (thats cách làm thế nào nó làm việc)

Và bất kỳ đầu ra chuỗi khác.

-1

nó có thể không được sử dụng "intented" nhưng tôi đã sử dụng nó cho dữ liệu serialization

storeToHardDrive(studentList.ToString()); 
13

sở thích cá nhân của tôi là toString() nên bao giờ được sử dụng cho bất cứ điều gì khác hơn là gỡ lỗi. Nếu bạn muốn tạo một chuỗi cho một đối tượng, hãy cung cấp một phương thức riêng để ghi rõ ý định của bạn (getName(), getDescription(), v.v.). Không bao giờ dựa vào việc thực hiện một toString().

Vấn đề là nhiều nhà phát triển thấy toString() như một chuỗi cấp gỡ rối và không nghĩ gì về việc thay đổi nó (nói khi các trường mới được thêm vào hoặc bị loại bỏ). Heck, một số nhà xây dựng toString() tự động sử dụng sự phản chiếu để tạo ra một toString() từ các trường.

Tôi đã tìm thấy tùy chọn này đã phục vụ tôi tốt trong những năm qua.

+0

Cho rằng String là cấu trúc hữu ích nhất trong lập trình, nó có thể cực kỳ mạnh mẽ để biết rằng mọi đối tượng trong không gian chương trình của bạn đều đáp ứng một hợp đồng để cung cấp một biểu diễn chuỗi của chính nó. Như với bất cứ điều gì mạnh mẽ, nó có thể bị lạm dụng, nhưng đó là một sự lãng phí để tránh nó. –

+1

Nhưng cho rằng hợp đồng a) bảo đảm không có gì về định dạng của chuỗi và b) không cung cấp api đối xứng để chuyển đổi từ String trở lại đối tượng, tôi thấy rằng đó là một hợp đồng ass yếu. Tôi đã gỡ rối nhiều vấn đề liên quan đến việc giả sử một "hợp đồng" không tồn tại đối với toString. –

+0

Tôi có cùng quan điểm. Tôi nghĩ rằng các công cụ đại diện nhãn-giao diện văn bản chỉ là quá sử dụng phương pháp. –

0

Bên cạnh những gì người khác đã nói, trọng ToString() cũng rất hữu ích khi sử dụng điều khiển mà gọi nó. Ví dụ: ComboBox:

myComboBox.Items.Add(new MyClass()); 
// now, whatever ToString() returns is shown in the 
// ComboBox, but you can get the object back by through 
// the SlectedItem property. 
6

Tất cả tôi có thể nói là tôi đã ngắt mã khi tôi thay đổi toString của lớp để hiển thị một số thông tin gỡ lỗi bổ sung.

Mã được đề cập là thư viện GUI đã quyết định sử dụng giá trị của toString như một số nội bộ (một vài năm trước ... Tôi quên chính xác nó là gì). Kết quả cuối cùng là tôi đã không sử dụng thư viện đó nữa.

Tôi có thể nói rằng vì một nhóm người lớn xem toString như đang được sử dụng để gỡ lỗi (bất kể ý kiến ​​của bạn về điều bạn nghĩ nó nên được sử dụng) nên việc sử dụng giá trị được trả lại từ đó là vấn đề để làm bất cứ điều gì có lập trình (như phân tích cú pháp) hoặc hiển thị nó cho người dùng.

Nếu bạn kiểm soát 100% các phương thức toString thì tất cả các phương tiện đều làm những gì bạn muốn.

Vì vậy, để trả lời câu hỏi, không toString không chỉ hữu ích để gỡ lỗi, bạn có thể làm bất cứ điều gì bạn muốn với nó. Tuy nhiên, đừng ngạc nhiên nếu toString thay đổi theo những cách khiến bạn không hài lòng.

+2

Tất cả tôi có thể nói rằng ngoài gỡ lỗi, nó là một trừu tượng rất, rất bị rò rỉ :) –

2

Đầu tiên, phương thức toString phải trả về biểu diễn văn bản có thể đọc được của con người đối tượng.

Sự cố này được đưa ra trong Effective JavaMục 10: Luôn ghi đè toString.

Nó tham chiếu Java API Specification cho phương pháp Object.toString:

Kết quả sẽ là một súc tích nhưng đại diện nhiều thông tin đó là dễ dàng cho một người đọc.

Ngoài gỡ lỗi, trọng phương pháp toString của một lớp có thể hữu ích khi ading đối tượng vào một JList hoặc một JTable, mà theo mặc định sẽ sử dụng phương pháp toString để hiển thị các đối tượng như một hình thức văn bản trong danh sách hoặc bàn.

Ví dụ, trong trường hợp của tôi, tôi đã ghi đè phương thức đối tượng toString được thêm vào JList để người dùng có thể xem thông tin về mục trong danh sách thông qua GUI.

Vì vậy, thực sự có trường hợp phương pháp toString hữu ích cho các trường hợp ngoài gỡ lỗi. Điều quan trọng là phải có thông tin trả về phương thức toString thực sự hữu ích cho một người để xem, không phải là triển khai thực hiện mặc định Object.toString nơi vị trí bộ nhớ của đối tượng được sử dụng cho biểu diễn văn bản của nó.

4

Theo kinh nghiệm của tôi, toString() có ít giá trị bên ngoài gỡ lỗi và ghi nhật ký. Bạn không thể phụ thuộc vào định dạng hoặc nội dung của nó theo thời gian, do đó, không phải là con người có thể đọc được, không phụ thuộc vào nó cho bất kỳ thứ gì ngoài đơn giản nhất của các đối tượng (chẳng hạn như các kiểu đối tượng nguyên thủy). Nếu có nhiều thành viên dữ liệu, chúng có thể thay đổi theo kiểu hoặc số theo thời gian, và đầu ra của toString() cùng với nó.

Một điểm khác tôi muốn thực hiện mạnh mẽ. Không gọi các phương thức khác trong toString() của bạn. Không có gì tệ hơn việc kiểm tra các nội dung biến trên một điểm ngắt trong trình gỡ rối, và sau đó có nhiều mã thực hiện hơn vì các cuộc gọi phương thức trong hàm toString().

3

Tôi nghĩ điều quan trọng là chỉ ra những người trả lời đề cập đến "toString" để ý chữ thường "t" thường nói về Java và những người trả lời đề cập đến "ToString" thường đề cập đến C#. Tất nhiên, điều này không áp dụng cho tất cả các câu trả lời.

Theo quan sát của riêng tôi (tôi sử dụng cả hai hàng ngày), các lập trình viên trong C# được khuyến khích ghi đè "ToString" để hiển thị một biểu diễn văn bản hữu ích. Trong khi đó, trong Java, tôi không thấy điều này gần như nhiều. Trong thực tế, tôi hiếm khi thấy điều này.

-JP

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