Учитывая следующий объект JSON с открытым текстом
class Chat {
    String id;
    String title;
    List<String> messages;
}
как я переопределить toString, чтобы он был  человеком, читаемым только для отладки?
Учитывая следующий объект JSON с открытым текстом
class Chat {
    String id;
    String title;
    List<String> messages;
}
как я переопределить toString, чтобы он был  человеком, читаемым только для отладки?
Вы можете сериализовать его в строку JSON:
class Chat {
    private static final GSON = new GSON();
    String id;
    String title;
    List<String> messages;
    public String toString() {
        return BuildConfig.DEBUG ? GSON.toJson(this) : super.toString();
    }
}
Ваше собственное решение работает, но оно не является слишком общим. Я бы создал вспомогательный класс (если вы не хотите делать встроенный текст на каждой печати)
public class PrettyPrinter {
   private static final Gson gson = new GsonBuilder()
         .setPrettyPrinting().create();
   public static String print(Object o) {
      return gson.toJson(o);
   }
}
чтобы вы могли
PrettyPrinter.print(chat);
Если вы настаиваете на использовании toString(), тогда будет
@Override
public String toString() {
   return isDebugEnabled() ? PrettyPrinter.print(this) : super.toString();
   // or BuildConfig.DEBUG ? ...;
}
или, возможно, вы хотите сделать это, расширив класс, подобный этому
public class JsonPrintable {
   public String toString() {
      return isDebugEnabled() ? PrettyPrinter.print(this) : super.toString();
   }
   /**
    * this should be logging dependent implementation
    * @return
    */
   public boolean isDebugEnabled() {
      return log.isDebugEnabled(); // personally use slf4j for logging... 
      // or return BuildConfig.DEBUG;
   } 
}
так
public class Chat extends JsonPrintable { ... }
Просто добавьте это в чат
@Override
public String toString() {
    return "\nIngrediente{" +
            "\n\tid='" + id + '\'' +
            "\n\ttitle='" + title + '\'' +
            "\n\tmessages=" + messages +
            "\n}";
}
обратите внимание, что ArrayList уже доступны для печати, на этом этапе вы можете легко
Chat chat = new Chat();
Log.d("Printing!", chat);
Работает для меня.
UPDATE
Я использовал это toString некоторое время назад, я нашел его в stackoverflow и немного его отредактировал, но я не помню ссылку источника:
@Override
public String toString() {
    StringBuilder result = new StringBuilder();
    String newLine = System.getProperty("line.separator");
    result.append( this.getClass().getName() );
    result.append( " Object {" );
    result.append(newLine);
    //determine fields declared in this class only (no fields of superclass)
    Field[] fields = this.getClass().getDeclaredFields();
    //print field names paired with their values
    for ( Field field : fields  ) {
        result.append("  ");
        try {
            if (field.isSynthetic() || field.getName().equals("serialVersionUID"))
                continue;
            result.append( field.getName() );
            result.append(": ");
            //requires access to private field:
            result.append( field.get(this) );
        } catch ( IllegalAccessException ex ) {
            System.out.println(ex);
        }
        result.append(newLine);
    }
    result.append("}");
    return result.toString();
}
немного изменив его, вы можете на самом деле распечатать все свойства в любом pojo, не добавляя их каждый раз в toString