Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的代码是否属于任何设计模式?_Java_Design Patterns - Fatal编程技术网

Java 我的代码是否属于任何设计模式?

Java 我的代码是否属于任何设计模式?,java,design-patterns,Java,Design Patterns,我有一段代码: 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

我有一段代码:

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();
私有字符串objectToString(objectobj){
if(字符串的obj实例)
返回(字符串)对象;
if(结构的obj实例){
Map Map=((Struct)obj.getMembers();
返回map.toString();
}
c类=obj.getClass();
if(c.isArray())
{
//迭代元素并返回值;
返回obj.toString();//以重新指定此
}
//这适用于任何其他数据类型
其他的
返回obj.toString();
}


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

您的代码是反模式的一个明显示例。最简洁的方法是简单地重写每个对象的toString()方法,您希望对其进行自定义文本表示。例如,每次调用System.out.println(someObject)——它调用这个特定对象的toString()的java是什么

下面是一个解释如何/为什么覆盖是一个好主意的示例。试想一下——为什么你必须把逻辑集中在不同对象的文本表示上,而这些对象可能没有任何共同之处?这就是为什么toString()是Java对象的一部分的确切原因,因为Java中的每个类都隐式继承自Object,所以重写toString()方法非常有意义


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

您的代码是反模式的一个明显例子。最干净的方法是简单地重写toString()方法,例如每次调用System.out.println(someObject)时,它调用这个特定对象的toString()是什么java

下面是一个解释如何/为什么重写是一个好主意的例子。试想一下——为什么您必须将逻辑集中在不同对象的文本表示上,而这些对象可能没有任何共同之处?这就是toString()的确切原因是Java对象的一部分,因为Java中的每个类都隐式继承自Object,所以重写toString()方法非常有意义


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

您正在尝试使用一种模式,而实际上应该使用多态性

结构上实现适当的toString(),您就到家了

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

代码的其余部分是冗余的(
(String)obj
obj.toString()
将在obj是字符串的情况下产生相同的结果)。

您正在尝试使用一种模式,而实际上应该使用多态性

结构上实现适当的toString(),您就到家了

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

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

我认为这是一种反模式。我强烈建议,对于每个对象,只需重写toString()方法,并完全划伤您的当前solution@LordDoskias杰克-愿意解释一下“为什么?”[重点是:在你解释“为什么”之前,你的两个评论可能只是“个人意见”]@LordDoskia在使用
时,如果instanceof else instanceof
不好,则无法修改所使用的类,尤其是数组类型。由于toString()的原因,认为不需要检查字符串同意字符串上的toString,我认为这是一种反模式。我强烈建议,对于每个对象,您只需重写toString()方法并完全删除当前solution@LordDoskias杰克想解释一下为什么吗?[要点是:除非你解释“为什么?”,否则你的两条评论可能只是“个人意见”]@LordDoskias在使用
时,如果instanceof else instanceof
不好,那么当你无法修改所使用的类时,就别无选择了,尤其是在数组类型的情况下。虽然没有必要检查字符串,因为toString()同意toString on String,感谢您扩展您的评论并解释为什么这是一个反模式。+1.我无权访问Struct类,它是第三方库。那么数组呢?既然Struct是第三方类,那么除了将其包装到您自己的对象中并重写to之外,您什么都做不了对象的字符串,该字符串反过来将从struct调用公共方法-可能是一个包含数组静态方法的类,其中包含您感兴趣的类型,因此我仍然需要在运行时动态包装结构,所以这不会有太大的不同。感谢您扩展您的评论并解释为什么这是一个反模式。+1.我没有访问Struct类的权限,它是第三方库。还有什么关于数组?因为struct是第三方类,所以除了将它包装到您自己的对象中,并重写对象的toString(这反过来会调用struct中的公共方法)之外,您不能做任何事情-可能是一个包含数组静态方法的类,该数组包含您感兴趣的类型