[JAVA]オブジェクト向け(8):インタフェース


前文は金成朴先生の講義に基づいて書かれた.詳細については、https://www.facebook.com/groups/codingeverybody/posts/7530033737037097/を参照してください.
参考にしてください.

インタフェース

  • 「どのような機能を作成すればいいですか?」VS「先実施」
  • からどのような機能を創造すべきかを考える.作成する機能を組み合わせて名前を付けます.
  • インタフェース構文の作成


    [public]インタフェース名{...}
    //例
    public interface User { ... }

  • 「インタフェース名」は、Upper CamelCaseによって記述されます.

  • インタフェースも拡張子Javaファイルで作成します.

  • インタフェースのすべてのフィールドはpublic static finalでなければなりません.すべての方法はpublic abstractでなければなりません.final、abstract自動貼り付けを省略します.
    -Java 8から、デフォルトメソッドと静的メソッドを宣言できます.
  • LottoMachineインタフェースを作成します。


    LottomMachineには上記の機能が必要です.
  • 1~45と書かれたBallを宝くじ機に入れます.
  • でマシン上のBallを混合します.
  • 混合のBallから6個取り出した.

  • public void setBalls(Ball[] balls);
    上記のコードのsetBallsメソッドは、外部から45個のボールを受け取る機能を有する.

    LottoMachineの手法から実装されていないコードが分かる.すなわち,インタフェースの方法は抽象的な方法である.



    実はabstractと書くべきですが、インタフェースの方法は抽象的な方法なので省略できます.

    インタフェースにあるすべてのフィールドは、共通の静的です。


    上図中
    int MAX_BALL_COUNT = 45;
    int RETURN_BALL_COUNT = 6;
    に省略されたコードがあり、以下のようになります.
    public static int MAX_BALL_COUNT = 45;
    public static int RETURN_BALL_COUNT = 6;

    インタフェースは省略可能

  • インタフェースのすべてのメソッドは抽象メソッドであるためabstractは省略できる.
  • インタフェースのすべてのフィールドは共通の静的であるため、省略することができる.
  • LottoMachineインタフェースを使用!


    1.インタフェースを使用するLottomachineImplクラスを作成し、インタフェースを実装します。LottoMachineで定義されているメソッドを上書きしましたが、メソッドの内容は空です。



    2.LottomMachineを実行するLottomMachineクラスを作成します。



    3.ボールレベルで受けるボールを設定します。


    Ballには、作成時に数字が変更できないという特徴が必要です.
    ここでは、不変クラスを使用してクラスを作成する必要があります.

    1)Ballのジェネレータを作成します.
    2)numberのアクセス制御者はプライベートであるため,内部でしか使用できない.
    3)getNumber()メソッドを作成し、自分のnumberを返します.

    今からBallを作ろう!



    楽透号は最大45個で、私たちは45個の対象を作ります.
    複文を利用する.

    lottoMachineオブジェクトを使用して実行されるコードを記述します.

    実行させると

    上記の結果を得る.
    なぜなら実現方法がないからだ.

    LottoMachineImplを充填する方法。


      package totojava.com.example.util2;
    public class LottoMachineImpl implements LottoMachine{
    
    private Ball[] balls;
    
        @Override
        public void setBalls(Ball[] balls) {
            this.balls = balls;
        }
        //Math.random() ==> 0.0 <= x < 1.0
        //                  0.0 <= x < 45;
        //                 (int) 0 <= x < 45;
        @Override
        public void mix() {
            for(int i =0; i<10000;i++){
                int x1 = (int)(Math.random()*45);
                int x2 = (int)(Math.random()*45);
                if(x1 != x2){
                    Ball tmp = balls[x1];
                    balls[x1] = balls[x2];
                    balls[x2] = tmp;
                }
            }
        }
    
        @Override
        public Ball[] getBalls() {
            Ball[] result = new Ball[6];
            for(int i=0;i<6;i++){
                result[i] = balls[i];
            }
            return result;
        	}
        }

    mix()メソッド


    0から44までランダムに得られたx 1,x 2が異なる場合、ball[x 1]とball[x 2]の値を変更する.これらの操作を10000回繰り返すと、balls[]配列の値がうまくブレンドされます.

    getballs()メソッド


    Ball[]配列を戻り値にします.
    Ball[]配列の最初の6つの値(Ball[0]、Ball[1]、...、およびBall[5])を新しい配列(result[0]、result[1]、...、およびresult[5])に入れます.
    結果を返します.

    指定した数値をインタフェースで定義した変数名に変換すると、より柔軟なコードになります。





    インタフェースのdefaultメソッド(JDK 8に追加されたメソッド)

  • Aという名前のユーザは、3つのメソッド宣言のインタフェースを作成した後に公開される.(ライブラリとして提供)
  • 複数のユーザは、このインタフェースを使用して実装される.
  • Aのユーザは,インタフェース上でもう一つの方法がよいと考えている.
    そこでメソッドを追加しました.
  • 人以上のユーザは、ライブラリが更新されたと判断し、更新を行った.何が起こるの?
  • インタフェースの静的メソッド(JDK 8に追加されたメソッド)

  • 静的方法
  • インタフェースを実装するクラスがなくても

    シングルループモード


    オブジェクトの作成に関連するパターン
  • プライベートジェネレータ
  • 個人は、自分の静的フィールド
  • を参照する.
  • は、共通の静的自身の静的フィールドを参照する方法
  • を返す.

    例によってSingletonを理解する




    上のコードは6つのBeanFactoryオブジェクトを作成します.

    BeanFactoryインスタンスを作成したいだけです。


    ルールを守れ!

  • プライベートジェネレータを製造します.
  • は、自分のインスタンスを参照する静的フィールドを宣言する.
  • 2によって生成されたインスタンスを返す静的メソッドを作成します.


  • メモリに1つのインスタンスしかアップロードされません!
    方法は慣れるまで繰り返し試します.