フィールドとして値を置くと、この値がオブジェクトの状態を表す場合にのみ意味があります。意味があるときはいつでもメンバ変数をパラメータメソッドより優先したいですか?
場合によっては、この「ルール」を避けるべきなのかなと思います。ここで
たとえば、このクラスを考える:
public class DbCar {
private ResultSet rs;
public DbMapper(ResultSet rs) {
this.rs = rs;
}
public Car buildObject(){
//.....does some mappings, then returns the builded car ....
}
}
だから我々は、ResultSetがメンバ変数として格納され、DbCarなどのあらゆるDbMapperはJDBCクエリから取得したResultSetを操作するので、それは理にかなっていることがわかります。
我々は次のようにのように見える、発信者だろう:
while (rs.next()) {
items.add(new DbCar(rs)).buildObject();
}
をしかし、現在のクエリが15000件のレコードを返したことを想像してみてください。
DbCarオブジェクトが> 15000個のインスタンスにまとめられました。
私の質問はガベージコレクタが十分に効率的なので、この膨大な数のインスタンスについて心配する必要はありませんか?この場合
public class DbCar {
public Car buildObject(ResultSet rs) {
//.....does some mappings, then returns the builded car ....
}
}
、DbCarの単一のインスタンスを(現在のスレッドで、現在の方法で)になります。次のようにこれらのすべてのインスタンスを回避することはもちろん
は、我々は、コードをリファクタリングすることができ呼び出し元は次のようになります。
DbCar dbCar = new DbCar();
while (rs.next()) {
items.add(dbCar.buildObject(rs));
}
どのような解決方法を選択する必要がありますか?より洗練されたコードやガーベッジコレクタを信頼し、ローカルパラメータメソッドを使用したより手続き的なコーディングスタイルのようなコーディング?
DbCarクラスは、エレガントな小さなメソッドにその「ビルド」メソッドを分割することを想像し、難しい選択を行うために
、例えばのような特定の責任に捧げそれぞれ1:「buildEngine」、「buildDoors」など...ローカルパラメータを選択する場合、これらのメソッドにResultSetを渡さなければならないでしょう。退屈でレッドダントなのですか?
私がダウンして手、パラメータとしてResultSetを渡します。 –
2番目のケースでは、 'DbCar'オブジェクトを作成する正当な理由がない限り、' buildObject'を静的にするだけです。 – trutheality
@trutheality DbObjectがDbObjectを継承していることを想像してください(ほとんどの場合)。 resultSetの操作を簡単にする便利なメソッドをリストしたものです。静的だった場合、このスーパークラスから利益を得ることはできませんでした。 – Mik378