2011-01-21 18 views
5
class Address 
{ 
    private enum Component 
    { 
    NUMBER, 
    STREET, 
    STATE, 
    COUNTRY 
    } 

    private Map<Component, String> componentToValue = ...; 
} 

Tôi muốn lớp học của tôi để chứa hai phương pháp:toString(): để gỡ lỗi hoặc cho con người?

  1. Một để chỉ ra giá trị của mỗi thành phần địa chỉ (vì vậy tôi có thể gỡ lỗi nếu bất cứ điều gì đi sai).
  2. Một để trả lại địa chỉ dưới dạng mong đợi của con người: "1600 Amphitheatre Parkway Mountain View, CA 94043".

Thực tiễn tốt nhất cho Object.toString() là gì? Nó chính có nghĩa là # 1 hay # 2? Có cách nào tốt nhất để đặt tên cho các phương pháp này không?

Trả lời

13

Bạn có định dạng một địa chỉ theo cùng một cách trong một tin nhắn SMS và trong một trang HTML? Bạn có định dạng theo cùng một cách bằng tiếng Anh, tiếng Pháp và tiếng Nhật không?

Nếu không, sau đó bạn có câu trả lời: bản trình bày không thuộc về đối tượng, nhưng đối với lớp trình bày hiển thị đối tượng. Trừ khi đối tượng được tạo riêng cho lớp trình bày, ví dụ nếu nó là một HtmlI18nedAddress, hãy sử dụng toString để gỡ lỗi.

Cân nhắc Date vs SimpleDateFormat. Date chứa trạng thái và SimpleDateFormat trả về nhiều lần biểu diễn.

+1

Nếu bạn đề cập đến SimpleDateFormat vs Date (hoặc bất kỳ ví dụ liên quan nào khác), tôi sẽ đánh dấu câu trả lời này là được chấp nhận. – Gili

-1

Một điều bạn có thể làm là sử dụng một lá cờ Debug để thay đổi điều này theo ý muốn:

public String toString(boolean debug) { 
    if (debug) return debugStringVersion; 
    else return humanVersion; 
} 

public String toString() { 
    return toString(Util.DEBUG); 
} 

Tất nhiên điều này giả định rằng bạn có một lớp tiện ích mỡ lên với một lá cờ gỡ lỗi trong đó.

+3

điều này không có ý nghĩa đối với tôi? những gì nên được sử dụng toString() trong mã sản xuất nếu nó thay đổi giá trị trả về của nó trong khi debunging? – lweller

+0

@lweller. Bạn không thể luôn làm điều này. Nhưng đôi khi nó có thể rất hữu ích. – jjnguy

3

Tôi sẽ nói điều đầu tiên. Định dạng dữ liệu không được mã hóa cứng vào hàm ToString() của đối tượng.

Tôi xem xét nó theo cách này: Tôi cố gắng tạo dữ liệu đầu ra ToString() có thể đọc được bằng hàm Parse (chuỗi dữ liệu) phù hợp (nếu chức năng đó thực sự tồn tại hoặc không quan trọng). Vì vậy, trong trường hợp này, nếu bạn muốn có một định dạng cụ thể, hãy viết một hàm cụ thể và để nguyên các thường trình kết xuất dữ liệu chung cho ToString().

0

Bạn có thể đọc từ một số tài sản debug mà bạn cấu hình tự động .:

@Override 
public String toString() { 

    if(debug) { 
     return debugAddrString() 
    } 
    return normalAddrString(); 

} 
+0

Tôi thấy tôi bị đánh vào cú đấm! –

+1

điều này không có ý nghĩa đối với tôi? những gì nên được sử dụng toString() trong mã sản xuất nếu nó thay đổi giá trị trả về của nó trong khi debunging? – lweller

+0

Trông giống như mô phỏng C 'define'. – helpermethod

-1

Các Javadoc nói:

Nói chung, phương thức toString trả về một chuỗi "textually đại diện cho" đối tượng này. Kết quả phải là thông tin ngắn gọn nhưng mang tính thông tin dễ dàng cho người đọc đọc.

Vì vậy, tôi đi với 2.

+4

Vâng, tôi nghĩ rằng không có nghi ngờ rằng nó "đại diện cho văn bản" đối tượng, nhưng câu hỏi (trong tâm trí của tôi) là "với mục đích gì"? Và tôi nghĩ rằng mục đích chính là để gỡ lỗi. –

0

Thông thường, chỉ nên sử dụng ToString cho thông tin gỡ lỗi.Hãy nhớ rằng bạn đang ghi đè phương thức trên Object; chính xác là khái niệm để gọi phương thức trên tham chiếu Object trả về một địa chỉ có thể đọc được của con người? Trong một số trường hợp, tùy thuộc vào dự án, điều này thực sự có thể có ý nghĩa, nhưng nó có vẻ hơi lạ với tôi. Tôi sẽ thực hiện một phương pháp mới.

Một điều cần lưu ý là hầu hết các IDE hiện đại đều sử dụng phương thức ToString để in thông tin gỡ lỗi về các đối tượng khi kiểm tra chúng.

+0

IBTD. 'StringBuilder' nói gì về câu đầu tiên của bạn? Là '.toString()' thực sự chỉ để gỡ lỗi? – glglgl

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