在Java中是否有用于将Object转换为String的标准接口?

时间:2013-04-05 14:12:48

标签: java generics interface

在Java中模拟lambda很有用,但是目前你必须实现实现某个接口的就地类......

例如,join函数可能会获得 Stringator 接口,因此无论包含的对象如何,都可以加入任何ListCollection

interface Stringator<T> { String toString(T t); }

public static <T> String join(Collection<T> col, String delim, Stringator<T> s) {
    StringBuilder sb = new StringBuilder();
    Iterator<T> iter = col.iterator();
    if (iter.hasNext())
        sb.append(s.toString(iter.next()));
    while (iter.hasNext()) {
        sb.append(delim);
        sb.append(s.toString(iter.next()));
    }
    return sb.toString();
}

我不知道任何标准 Stringator ToStringer 界面......

这个join实现可以简化bean操作。例如,获取书籍清单:

List<Book> books = ...;
String list =
  join(books, ", ", new Stringator<Book>{ toString(Book b) {return b.getName();} });

请注意,使用标准 toString 的建议违反了Java约定:toString用于调试(查找JavaDoc和Java lang规范)!

更新 Java已经有了向其他方向工作的界面 - PropertyEditor。每个实现都可以从Object构建String。我从String ...

中寻找Object

更新2 。许多人认为我错误地避免toString。这来自Java 7 Lang Spec(第6.1节):

A method that converts its object to a particular format F should be named
toF. Examples are the method toString of class Object and the methods
toLocaleString and toGMTString of class java.util.Date.

因此,如果我有Book对象,toString自然必须返回ISBN,但如果我需要加入书名?这就是toString不那么好,java.text.Format.format或其他看起来更自然的原因。

4 个答案:

答案 0 :(得分:2)

覆盖toString(),它不违反任何java惯例,实际上是推荐的做法。

  

返回对象的字符串表示形式。一般来说,   toString方法返回一个“文本表示”的字符串   宾语。结果应该是简洁但信息丰富的表示   一个人很容易阅读。 建议全部   子类重写此方法

http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#toString%28%29

答案 1 :(得分:1)

std java中没有ToStringer或类似的界面,你可以定义自己的,并使用

String stringValue()

类似于intValue()longValue()等,通常用于java

答案 2 :(得分:1)

java.text.Format.format,但它不是很好,而且是抽象类。

Java SE 8可能有一个仿函数接口,用于在两种任意类型之间进行转换,其中一种类型可能是String

答案 3 :(得分:1)

覆盖toString()之外没有任何问题,只有这样才能让您只有一种方式将对象表达为字符串。我认为ganvenkoa建议的东西可以让你轻松地以自定义的方式表达它。想象一下,如果您正在处理Customer返回toString()的{​​{1}}对象,但是当您使用John Smith加入一群客户时,您希望客户成为表示为join(...)

我曾用过的一件事是Smith, John这样的实用程序(后者又使用com.google.common.collect.Iterables.transform(Iterable))并将结果传递给Function。 我希望Java 8会变得更优雅