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.Codeの設計パターンに該当するかどうかを誰かが提案できますか?

4

2 に答える 2

6

あなたのコードは、アンチパターンの明確な例です。最もクリーンな方法は、カスタムのテキスト表現が必要なすべてのオブジェクトの toString() メソッドを単純にオーバーライドすることです。たとえば、System.out.println(someObject) を呼び出すたびに、この特定のオブジェクトの toString() を呼び出す Java は何ですか。

これは、オーバーライドすることをお勧めする方法/理由を説明する記事です。考えてみてください - まったく共通点がないかもしれない異なるオブジェクトのテキスト表現に関して、なぜロジックを中心に置く必要があるのでしょうか? これが、toString() が Java の Object オブジェクトの一部である正確な理由です。Java のすべてのクラスは Object から暗黙的に継承されるため、toString() メソッドをオーバーライドすることは完全に理にかなっています。

toString() メソッドをオーバーライドすると、適切なテキスト表現を作成したい場合に必要になる可能性のあるオブジェクトの内部状態にアクセスすることもできます。フィールド、またはゲッターなど。テキスト表現のためだけにそれを行うのは意味がありません)。

于 2012-04-26T14:21:51.120 に答える
0

本当にポリモーフィズムを使用する必要がある場合に、アダプターパターンを使用しようとしています。

あなたに適切な toString() を実装するStructと、あなたは家にいます。いえ

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

コードの残りの部分は冗長です ( obj が文字列の場合は同じ結果になります) (String) objobj.toString()

于 2012-04-26T14:22:35.017 に答える