【问题标题】:How to override toString() inside wrapper class?如何在包装类中覆盖 toString()?
【发布时间】:2014-07-05 20:30:51
【问题描述】:

向我展示了一种将一些数据从数据库解析为实体的方法。我得到了这个很好的包装类

public class ObjectWrapper implements Wrapper{
   private Object wrappedObject;
//...
public static Wrapper wrap(ResultSet rs, int column, int columnType) throws SQLException {        
        if (columnType == 0) {
            return new EmptyListExceptionWrapper();
        } else {
            return new ObjectWrapper(rs.getObject(column));
        }
    }
}

当我尝试使用它来解析这些对象时,我得到像 databaseConnection.ObjectWrapper@5010be6 这样的名称,而不是真实的名称。另一个好人告诉我,我必须在 ObjectWrapper 类中重写 toString() 方法才能获得真正的结果。

我该怎么做呢?我知道不能添加或更改这些原始类型。例如,我应该在下面做类似的事情吗?

 public static String toString(){
     String str = new String();
     return str += wrappedObject;
 }

【问题讨论】:

  • 真实结果是什么意思?
  • 我的意思是真实姓名。例如,不是databaseConnection.ObjectWrapper@5010be6,而是ΔΕ01.1

标签: java overriding wrapper tostring


【解决方案1】:

首先,应用于类的特定实例的方法不应该是static,并且通常应该避免字符串连接,而应使用StringBuilder

其次,许多工具将为您创建有用的toString 方法:您的 IDE 可以生成一个,而 Apache Commons Lang 有 ToStringBuilder

如果您没有任何关于包装类型的信息(以及它自己的toString 实现),那么您可能只使用这样的东西:

@Override
public String toString() {
    // uses a StringBuilder implicitly
    return "ObjectWrapper[" + wrappedObject.toString() + "]";
}

【讨论】:

  • 注意,您可以(并且应该)只使用wrappedObject 而不是wrappedObject.toString()
  • @ChrisJester-Young 现在可以使用了!我明白发生了什么。非常感谢。
  • @ChrisJester-Young 我继续说清楚,因为 OP 是该主题的新手,无论如何强制调用都是相同的。
【解决方案2】:

Object.toString() 这是你在调用的

str += wrappedObject;

默认情况下会返回对象的哈希码。 您需要将 WrappedObject 转换为可以打印

属性的东西
class objectDef{
    private int x;
    public int y;
    public int getX() { return x; }
}

//ToString method
public String toString()
{
    return "ObjectWrapper has Y: " + ((objectDef)wrappedObject).y) + " x: " + ((objectDef)wrappedObject).getX() ".";
}

【讨论】:

  • 默认的toString不使用对象的内存地址(顺便说一句,这是可移动的,因此Java代码无法访问);它使用对象的哈希码。
猜你喜欢
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 2016-11-06
  • 2017-02-21
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多