2016-06-01 12 views
0

私は以下のコードを使用して複数のpojoクラスを持っています。ToString実装の複数のクラスを共有

public class ToStringImpl { 

public String toString(){ 
     StringBuilder result = new StringBuilder(); 
     String newLine = "\n"; 


     result.append(this.getClass().getName()); 
     result.append(" Data {"); 
     result.append(newLine); 

     //determine fields declared in this class only (no fields of superclass) 
     Field[] fields = this.getClass().getDeclaredFields(); 

     //print field names paired with their values 
     for (Field field : fields ) { 
     result.append(" "); 
     try { 
      result.append(field.getName()); 
      result.append(": "); 
      //requires access to private field: 
      result.append(field.get(this)); 
     } catch (IllegalAccessException ex) { 
      System.out.println(ex); 
     } 
     result.append(newLine); 
     } 
     result.append("}"); 

     return result.toString(); 
} 

} 

上記のクラスを別のクラスから呼び出すにはどうすればよいですか? は、どのように私は別のクラスに合格しない各クラスの在庫

public class Customer { 

private String name; 
private String address; 

...getter...setter... 

public String toString(){ 

    ToStringImpl log = new ToStringImpl(); 
    //how do I pass different classes here? 
    return log.toString(); 
} 

} 

public class Store { 

private String logo; 
private String type; 

....getter...setter... 
} 

public class Inventory { 

private boolean isAvailable; 
private long index; 

...getter...setter 
} 

、店舗、私は顧客と呼ばれるPOJOクラスがあると?またはこれを行うためのより良い方法がある場合は?または、インターフェイスとしてtoStringを作成し、それを各クラスで実装してコンストラクタとして渡す方が良いでしょうか?

+0

実際にメソッドがオブジェクトに属しているようにするには(どこかにある 'static'メソッドと比較して)、[default methods](https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods。html) – Michael

答えて

3

何ができるかは、ToStringImplクラスの静的でtoString()メソッドを作るです。私は、しかしtoString()それを呼び出す例

getClassString()のようなものに変更していないでしょう。

public static String getClassString(Object o) 
{ 
    StringBuilder result = new StringBuilder(); 
    String newLine = "\n"; 

    result.append(o.getClass().getName()); 
    result.append(" Data {"); 
    result.append(newLine); 

    // determine fields declared in this class only (no fields of 
    // superclass) 
    Field[] fields = o.getClass().getDeclaredFields(); 

    // print field names paired with their values 
    for (Field field : fields) 
    { 
     result.append(" "); 
     try 
     { 
      result.append(field.getName()); 
      result.append(": "); 
      // requires access to private field: 
      result.append(field.get(o)); 
     } 
     catch (IllegalAccessException ex) 
     { 
      System.out.println(ex); 
     } 
     result.append(newLine); 
    } 
    result.append("}"); 

    return result.toString(); 
} 

その後、あなたのPOJOクラスでは、とそれを呼び出す:

public String toString() 
{ 
    // how do I pass different classes here? 
    // by passing the 'this' reference 
    return ToStringImpl.getClassString(this); 
} 
+0

ありがとう!私は多くの重複したコードを減らしました。 toStringを書き直すことによって – logger

0

メソッドをオーバーライドすると、たとえばObject#toString()のように、そのクラスに対してオーバーライドするだけです。あなたは、次のいずれかを行うことができます

  • それを必要とし、そしてちょうどそれはどこからそのオブジェクトにtoString()を呼ぶかもしれないすべてのクラスにごtoString()を追加します。 (推奨しません)
  • ToStringImplを任意のクラスに拡張し、オブジェクトのtoString()を呼び出します。
  • ToStringImpl#toString()は、静的作成し、例えば、引数(推奨)としてオブジェクトを渡す:

    public static void objectToString(Object ob){ 
        //your code here, just replace "this" with "ob" 
    } 
    
1

がすでにありこれを行うライブラリ。 apacheの-コモンズライブラリにToStringBuilderを見て、あなたのドメインオブジェクトのtoStringメソッドは、次のようになります。最適なプランは自家製のコードをリッピングし、Apache-コモンズにドロップするように私には思われる

@Override public String toString() { 
    return ToStringBuilder.reflectionToString(this); 
} 

、またはProject Lombokを使用してください。このホイールを再開発する必要がある場合は、静的メソッドを使用し、パラメータとして印刷するオブジェクトを取得するToStringBuilderの例をコピーすることは合理的です。

ToStringBuilderには、印刷するフィールドを制限する機能が含まれています。独自のコードは、自分の正気のために似たようなことをする必要があります。 toStringメソッドは、デバッグとロギングのための情報を出力するために使用されます。投稿されたコードのようなすべてのフィールドを取得しただけでは、ログエントリでtoStringを呼び出すたびにオブジェクトの内容全体がダンプされ、読めないものがあると、ログがいっぱいになり、情報。

あなたはここに情報を消費しているので、圧倒的ではなく有用なものにしてください。

+0

Nathanのポイントを強調する:toString値のすべてのフィールドを自動的に含むことは悪い習慣であり、避けるべきです。私は最近、これを行ったプロジェクトに取り組みました。配列やコレクションのプロパティを持つクラスは、印刷する災害でした。ロギングだけでアプリケーションが膝に届きました。 – VGR

関連する問題