2015-09-21 17 views
6

Tôi muốn thoát khỏi sự phụ thuộc này: import com.google.common.base.MoreObjects;Thay thế cho MoreObjects trong Java 8

Có cách nào đơn giản và/hoặc thanh lịch để viết lại toString() hàm sau sử dụng Java 8 chức năng có nguồn gốc?

@Override 
public String toString() { 
    return MoreObjects 
    .toStringHelper(this) 
    .add("userId", this.userId) 
    .add("timestamp", this.timestamp) 
    .toString(); 
} 

Trả lời

19

Bạn có thể sử dụng StringJoiner từ gói java.util.

Ví dụ:

@Override 
public String toString() { 
    return new StringJoiner(", ", ClassName.class.getSimpleName() + "[", "]") 
    .add("userId=" + userId) 
    .add("timestamp=" + timestamp) 
    .toString(); 
} 
+0

Tôi sẽ chọn giải pháp này cho sự rõ ràng và thanh lịch của nó. Tôi thấy 'StringBuilder' ít tự giải thích so sánh nó với' StringJoiner'. Đồng bằng 'str1 + str2' là quá thấp (và tiết) cho tôi. Cảm ơn bạn. – Costin

+2

Hãy nhận biết rằng 'Lớp # getSimpleName()' là chậm chạp. – Konsumierer

3

Tại sao không tự xây dựng chuỗi? Mã này rất đơn giản để viết và hiểu, mà không cần sử dụng bất kỳ tính năng cụ thể nào của Java 8.

@Override 
public String toString() { 
    StringBuilder sb = new StringBuilder(); 
    sb.append(getClass().getSimpleName()).append('{') 
    sb.append("userId=").append(userId); 
    sb.append(", timestamp=").append(timestamp); 
    return sb.append('}').toString(); 
} 
+0

'sb.append (" MyMap-String-Integer = "). Append (myMapStrInt)' tạo ra một giống json đẹp hình thành bản đồ của tôi? – Costin

+3

@Costin, hầu hết các bản đồ đã triển khai đúng phương thức 'toString()', vì vậy có. –

4

Tôi không thấy bất kỳ lý do gì để sử dụng này toStringHelper thậm chí trước khi Java-8. Việc thực hiện đơn giản không phải là dài hơn:

@Override 
public String toString() { 
    return getClass().getSimpleName()+"[" 
      +"userId: "+this.userId+", " 
      +"timestamp: "+this.timestamp 
      +"]"; 
} 
+0

Điều này sẽ (EDIT: * có thể *) tạo ra nhiều rác hơn giải pháp 'StringBuilder'. – sdgfsdh

+5

@sdgfsdh, bạn có bằng chứng nào không? –

+4

@sdgfsdh Tôi nghĩ trình biên dịch sẽ tối ưu hóa nó và bytecode được tạo sẽ giống như sử dụng StringBuilder (vì + không nằm trong vòng lặp) – Tunaki

1

Chỉ cần có tính năng một giải pháp khá mát mẻ để cho IntelliJ Idea tạo ra toString với StringJoiner: https://gist.github.com/vlastikcz/6a3b5c158bdb7bf6e9fd (thanks a lot cho tác giả)
Thêm mã các mẫu toString: nhấn Alt + Chèn, chọn toString, sau đó chọn Cài đặt bên cạnh Mẫu, thêm bằng dấu cộng: enter image description here

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