我有这段代码:
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.Code的任何设计模式是直截了当的,只是为了澄清它查看传递的参数,并取决于以人类可读形式返回字符串的类型。
答案 0 :(得分:6)
您的代码是反模式的明显示例。最干净的方法是简单地覆盖您想要自定义文本表示的每个对象的toString()方法。例如,每次调用System.out.println(someObject)时 - 它会调用此特定对象的toString()。
这是一个article,解释如何/为什么覆盖这是一个好主意。试想一下 - 为什么你必须将关于不同对象的文本表示的逻辑集中在一起,这些对象可能没有任何共同之处?这就是为什么toString()是Java的Object对象的一部分的原因,并且因为java中的每个类都隐式地从Object继承,所以覆盖toString()方法是完全合理的。
覆盖toString()方法还可以访问对象的内部状态,如果要进行正确的文本表示,可能需要这样做,这对于您提出的实现是不容易的(尽管它当然是可能的)拥有公共领域或吸气剂等。仅仅为了文本表示而这样做是没有意义的。)
答案 1 :(得分:0)
您正在尝试使用Adapter模式,您应该使用多态。
在Struct
上实施适当的toString(),你就在家。即。
public class Struct {
...
public String toString() {
return getMembers().toString();
}
}
其余代码是冗余的(如果obj是字符串,(String) obj
和obj.toString()
会产生相同的结果。)