- PR -

JAVAにおけるstaticメソッド

投稿者投稿内容
yamasa
ベテラン
会議室デビュー日: 2003/02/15
投稿数: 80
投稿日時: 2003-05-14 16:00
引用:

でもコードについては・・calculatorというモデリングをしたのであれば
(中略)
これじゃダメなんですか?
インスタンス化の省略?


これらのクラスを利用する側からすれば、
「クラスAに対する計算方法を知っているCalculator」が欲しいのであって、
それが具体的にどのクラスで実装されているかについては
どうでもよいことです。

ですから、無名クラスを使わない場合でも、私なら
ACalcはパッケージプライベートなクラスとするか、
クラスAのprivate staticなメンバクラスとして定義するでしょう。

# Collections.reverseOrder()などは、まさにこのパターンです。

Singletonにしているのは、あくまでついでですね。


# "private staticな内部クラス" → "private staticなメンバクラス" に修正。

[ メッセージ編集済み 編集者: yamasa 編集日時 2003-05-15 01:08 ]
zaxx_MD
大ベテラン
会議室デビュー日: 2003/04/21
投稿数: 204
お住まい・勤務地: 千葉県柏市
投稿日時: 2003-05-14 16:33
実は私も一瞬staticと書いてしまったのですが・・ガマンガマン・・です。

引用:

yamasaさんの書き込み (2003-05-14 16:00) より:
ですから、無名クラスを使わない場合でも、私なら
ACalcはパッケージプライベートなクラスとするか、
クラスAのprivate staticな内部クラスとして定義するでしょう。


ふむ・・そうですね。

じゃあ、こういうことですね。
コード:
protected class ACalc extends Calculator {
    protected int getValue(Object o) {
      return ((A)o).getHoge();
    }
}

public class A {
  private ACalc calc = new ACalc();

  public int getSum(Collection c) {
    return calc.getSum(c);
  }
  ...
}


でAとACalcは同じパッケージということで。

なぜ頑なにinner classを避けるかというと、
1.CVS等で管理するときにファイル単位でクラスが分かれていたほうがやっぱり簡単だった
2.本来inner classはそのクラスから利用する為だけのものとして誕生した
3.他のクラス構成に流用しやすい(コピペ万歳)
という思いがあります。
yamasa
ベテラン
会議室デビュー日: 2003/02/15
投稿数: 80
投稿日時: 2003-05-15 01:35
引用:

zaxx_MDさんの書き込み(2003-05-14 16:33)より:
じゃあ、こういうことですね。
(以下略)


いえ、ACalcをパッケージプライベートなクラスにするというのは、
単に以下のように書き換えるって意味です。
コード:
// Calculatorクラスはそのまま。

class ACalc extends Calculator {
  protected int getValue(Object o) {
    return ((A)o).getHoge();
  }
}

public class A {
  private static final Calculator A_CALCULATOR = new ACalc();

  public static Calculator calculator() {
    return A_CALCULATOR;
  }

  public int getHoge() {
    ...
  }
}
// AとACalcは同じパッケージ内に置く。


なお、クラスAにcalculatorメソッドだけを定義し、getSumメソッドを
定義していない理由は、将来Calculatorクラスに最大値・最小値・
平均・標準偏差などを求めるメソッドを追加したとしても
クラスAに対する変更をしなくて済むからです。
zaxx_MD
大ベテラン
会議室デビュー日: 2003/04/21
投稿数: 204
お住まい・勤務地: 千葉県柏市
投稿日時: 2003-05-15 16:55
引用:

なお、クラスAにcalculatorメソッドだけを定義し、getSumメソッドを
定義していない理由は、将来Calculatorクラスに最大値・最小値・
平均・標準偏差などを求めるメソッドを追加したとしても
クラスAに対する変更をしなくて済むからです。


なるほど、calculatorのモデリングはそういった意図ですか。
そういうことであれば、元に戻してACalcを個別のクラスとして提供する方が
私の意図には合いそうです。
また、ACalcというよりはCollectionOperatorというかATotalStuffとか
どちらかというと便利屋になってしまうので、
CollectionSummaryというスーパークラスで再定義したほうが
私にとっては直感的です。

スキルアップ/キャリアアップ(JOB@IT)