【第3条】私有構造関数によるインスタンス化不可能な能力の強化


静的メソッドと静的ドメインのみを含むクラスを作成する場合があります.このようなクラスには、オブジェクト向けの言語でこのようなクラスを乱用してプロセス化されたプログラムを記述する人もいるため、いくつかの評判が悪い.
 
    原文のこの言叶の理解に対して、私は深い印象を持っていて、多くのVB 6工事から転じてJavaあるいはC#(VB.Netを含む)のプログラマーをして、文句を言っています:やはりVB 6は使いやすくて、各种の方法は简単で明瞭で、何のようです  left()  trim()  split()  cstr()  replace() などの方法はどんなに簡単で使いやすいか.これらのオブジェクト向け言語では、Class.function()を使用する必要があります.
 
    幸いなことに、VB 6のライブラリ関数が前にクラスの名前を付けるようになっただけだ.もとは自分で书いたあれらの関数(主にprivateの)は依然としてすでにクラスの中の関数が现れたので、ある日、もしある人がもとのpublic関数(モジュールの中の)が使いにくいことを発见して、このためにクラスを书いて、それからクラス名.方法名を通じて呼び出して、それでは大半は原文の中で言及した间违いを犯しました——静的な方法の乱用.
 
    さらに、静的と非静的の違いを知らずに、直接こう書きます.  new Samething().doSamething();
 
     いくつかの問題が外れて、実例化できない能力に戻った.ツールクラス(util)は、インスタンス化されるべきでないクラスの代表である.実用的な機能を提供しているだけで、インスタンス化することは意味がありません.たとえば、先ほど述べたString関連の機能関数:replaceなど
Stringは、String s 2=s 1.replace(「x」,「y」)を通常使用する非静的方法であるreplace方法を提供している.
Stringが提供するreplaceはs 1の最初の「x」を「y」に置き換えるしかないと仮定し、s 1のすべての「x」を「y」に置き換えるために、このようなツールクラスを書くことができます.
public StringUtil{
     public static String replace(String str, String pattern, String repl){
         String rtn= str;
         while (rtn.instring(pattern)>=0){
              rtn = rtn.replace(pattern,repl);
         }
         return rtn;
    }
}

 
次に、String s 2=StringUtil.replace(s 1,“x”,“y”);
 
    この例はあまりよくないかもしれません(Stringが提供するreplaceはもともとすべてを置き換えることができるので、実はこの例はFlexのAS 3言語に由来して、AS 3の中のStringが提供するreplaceの方法は最初の一致する項目だけを置き換えることができます)
 
    また問題を飛ばしたようで、「道具類」とは何かに走った.やはり、クラスをインスタンス化できないようにする方法について話しましょう.実は、プライベートな構造関数を簡単に書いて、クラス内部でこの構造関数を呼び出す場所がないことを保証します.
コンストラクション関数は1つのプライベートなものしかないため、外部では呼び出せませんが、内部では呼び出されません.これにより、クラスがインスタンス化されないことが保証されます.
構造関数を書かないほうが簡単ではないかと聞かれるかもしれません.実はそうではありません.もし構造関数を書かなければ、コンパイルするとき、コンパイラはこのクラスに自動的に空の公有構造関数を加えることができて、それでは“本当の気を漏らしました”.実はここに書くプライベートコンストラクション関数は空っぽでいいです.どこにも呼び出されないので、ここでは数をチャージしているだけです(just be here!)
 
    もちろん、このような処理があるたびに、この空のプライベート構造関数に注釈を書いて、後世にこの空のプライベート構造関数の意図がクラスがインスタンス化されることを禁止していることを伝える良い習慣があります.この点が重要です!そうでなければ、後であなたがここで間違いを犯したと勘違いし(publicをprivateと書き間違えた)、「修正」するかもしれません.
 
    このメモを読んで、私が最初にしなければならないことは(このメモを書く以外に)、私のすべてのutil.*を再審査して、それらのために空のプライベート構造関数を追加してコメントを書くことです.よし、now、do it!
 
 
【Effective Java学習ノート】シリーズ連載ご案内:http://tonylian.iteye.com/categories/64208