2013-05-13 21 views
24
@Override 
public String toString() { 
    return new Gson().toJson(this); 
} 

Tôi có vi phạm một số thực hành hay không, "Joshua" -pattern điều, mẫu thiết kế chung hoặc quy ước khác bằng cách làm điều này như hành vi mặc định cho các đối tượng mô hình của tôi?OK để sử dụng đầu ra JSON làm mặc định cho toString()?

toString() sẽ bằng cách nào đó chỉ được sử dụng trong gỡ lỗi trong mô hình (Android) mà chúng tôi hiện đang sử dụng. Đó cũng là lý do tại sao tôi thích nhìn thấy đối tượng trong JSON vì nhiều sự kiên trì ORM/json sẽ xảy ra thông qua http-> php/python-> mysql và đến SQLite cục bộ.

+3

Bạn không vi phạm bất cứ điều gì. 'toString()' có thể trả về bất kỳ chuỗi nào (nhưng nó có thể trả về cùng một chuỗi mỗi khi bạn gọi nó trên cùng một cá thể, trừ khi trạng thái bên trong của cá thể thay đổi). –

+0

có, đó là prerequesite nếu được cho là ... duy nhất (?) Cho toString(). Theo yêu cầu của quy ước là – tortal

+1

@SotiriosDelimanolis: không phải nếu trạng thái nội bộ của cá thể thay đổi. –

Trả lời

38

Có. Bạn có thể sử dụng thư viện GSON/Jackson/Reflections để thực hiện phương thức toString().

Có vài cách để triển khai phương pháp toString.

  1. Reflections (Apache thư viện)

    @Override 
    public String toString(){ 
        return org.apache.commons.lang3.builder.ReflectionToStringBuilder.toString(this); 
    } 
    
  2. JSON dựa thực hiện (GSON, thư viện Jackson)

    // GSON library for JSON 
    @Override 
    public String toString(){ 
        return new com.google.gson.Gson().toJson(this); 
    } 
    
    // Jackson libabry for JSON/YAML 
    @Override 
    public String toString() { 
        try { 
         return new com.fasterxml.jackson.databind.ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(this); 
        } catch (com.fasterxml.jackson.core.JsonProcessingException e) { 
         e.printStackTrace(); 
        } 
        return null; 
    } 
    
  3. ToStringBuilder (có sẵn với thư viện apache-commons)

    @Override 
    public String toString() { 
        return new org.apache.commons.lang3.builder.ToStringBuilder(this). 
         append("field1", field1). 
         append("field2", field2). 
         toString(); 
    } 
    
  4. cứng lõi toString() thực hiện

    @Override 
    public String toString() { 
        return new StringBuilder() 
         .append("field1:"+field1) 
         .append("field2:"+field2) 
         .toString(); 
    } 
    
+2

Câu trả lời tuyệt vời, rất chi tiết với một số tùy chọn và trong vài dòng. – maaw

+0

Câu trả lời có thể được cải thiện bằng cách thảo luận về hợp đồng [toString] (https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#toString()) và liệu một JSON serialization đáp ứng hợp đồng đó (tôi nghĩ nó) và bất kỳ nhược điểm tiềm ẩn nào (hiệu suất? Nhưng giảm nhẹ theo hợp đồng - phương pháp để gỡ lỗi/hiển thị, do đó không được mong đợi là biểu diễn) – Rich

7

Không có hại gì khi thực hiện theo cách này. Tôi sẽ đề nghị bạn để tạo ra một biến tĩnh cho Gson dụ của bạn và cho phép in ấn khá:

static Gson gson = new GsonBuilder().setPrettyPrinting().create(); 

Bằng cách này, đầu ra từ toString phương pháp sẽ được định dạng.

+0

Tại sao GsonBuilder mới(). SetPrettyPrinting(). Tại sao không chỉ là "new Gson()"? –

+2

tôi đã nhận được nó sau khi một số googling. Nên làm điều đó trước. Sử dụng bản in đẹp sẽ khá hữu ích –

0

Rất xấu vì hiệu suất vì Gson sử dụng nội tâm để tìm ra trường cần in.

Ngoài ra, tôi nghĩ điều đó là ổn. Đó không phải là việc thực thi Java toString chuẩn nhưng tôi không nghĩ rằng việc thay đổi nó sẽ là một mẫu chống.

+2

Câu trả lời của bạn không cung cấp bằng chứng hoặc đối số nào khác ngoài "Tôi nghĩ", không hữu ích lắm :-( – Rich

2

Chú ý: Nếu bạn sử dụng mà GSon in ấn đẹp trong phương thức toString() của nó sẽ trông giống như rác trong debugger của bạn bởi vì nó sẽ được đầy đủ các dòng mới.

(Xin lỗi không có đủ đại diện để nhận xét ở trên)

+0

Không chắc chắn bạn đã ghi nhớ trình gỡ lỗi nào nhưng IntelliJ và có lẽ các IDE khác sẽ đối phó tốt với các dòng mới trong đầu ra 'toString()'. – Rich

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