1

我有这段代码:

private String objectToString(Object obj){
if (obj instanceof String)
    return (String)obj;
if (obj instanceof Struct){
    Map<String,?> map = ((Struct)obj).getMembers();
     return map.toString();
 }
Class c = obj.getClass();
if (c.isArray())
{
    //obj. iterate elements and return values;
    return obj.toString();//to redi this

}
//this is for any other datatypes
else
    return obj.toString();

}

有人可以建议这是否属于 GOF 的任何设计模式。代码很简单,但只是为了澄清它查看传递的参数,并取决于以人类可读形式返回字符串的类型。

4

2 回答 2

6

您的代码是反模式的一个明显示例。最干净的方法是简单地覆盖您想要自定义文本表示的每个对象的 toString() 方法。例如,每次调用 System.out.println(someObject) - java 调用这个特定对象的 toString() 是什么。

这是一篇文章,解释了如何/为什么重写是一个好主意。想想看 - 为什么你必须集中逻辑关于不同对象的文本表示,这些对象可能没有绝对的共同点?这就是为什么 toString() 是 Java 的 Object 对象的一部分的确切原因,并且由于 Java 中的每个类都隐式地继承自 Object,因此重写 toString() 方法非常有意义。

覆盖 toString() 方法还可以让您访问对象的内部状态,如果您想进行适当的文本表示,这可能是必需的,这在您建议的实现中不容易做到(虽然当然可以公开字段或吸气剂等。仅仅为了文本表示而这样做是没有意义的)。

于 2012-04-26T14:21:51.120 回答
0

您正在尝试使用真正应该使用多态性的适配器模式。

在你的身上实施正确的 toString() ,Struct你就回家了。IE

public class Struct {
    ...
    public String toString() {
        return getMembers().toString();
    }
}

其余代码是多余的(如果 obj 是字符串(String) obj,将产生相同的结果)。obj.toString()

于 2012-04-26T14:22:35.017 回答