JAva-デフォルトメソッド、静的メソッド


この投稿は学習用の記事です.
間違った内容があるかもしれません.

📒 デフォルトメソッド

  • インタフェースにメソッド宣言を提供し、メソッド宣言のメソッド
  • ではない.
    public interface Foo{
        void printName();
        default void printNameUpper(){
            System.out.println(getName().toUpperCase());
        }
        String getName();
    }
    
    
    class MyClass implements Foo{
    }
    
    
    public class Main {
        public static void main(String[] args) {
           MyClass my=new MyClass();
           my.printNameUpper("hiE"); //구현하지 않아도 사용이 가능하다.
        }
    }
    Q)なぜ基本メソッド機能が必要なのか.
    A)インタフェースに機能を追加すると、すべてのインプリメンテーションで上書きが必要な問題が発生します.すなわち,そのインタフェースを実現するクラスを破壊することなく,新しい機能を追加することができる.
  • 基本手法は,実装体が知らない場合に付加される機能であるため,一定のリスクがある.
  • コンパイルエラーではありませんが、インプリメンテーションによってはランタイムエラーが発生する場合があります.
  • は書面化しなければならない.(@implSpec java dogラベルを使用)
  • /**
     * @implSpec
     * 이 구현체는 문자열을 대문자로 바꿔 출력해준다.
     */
    default void printNameUpper(){
    	System.out.println(getName().toUpperCase());
    }
  • 本人が修正できるインタフェースだけが基本的な方法を提供することができます.
  • インタフェースは、継承インタフェースから抽象メソッドに変更できます.あるいは、必要に応じて再定義して使用することもできます.
  • public interface Foo{
        default void printNameUpper(String name){
            System.out.println(name.toUpperCase());
        }
    }
    
    
    
    public interface Bar extends Foo{
    	void printNameUpper(String name); //다시 추상 메소드로 변경 가능.
    }
    
    
    
    public class MyClass implements Foo{
        @Override
        public void printNameUpper(String name){
            System.out.println(name.toLowerCase()); //재정의 가능
        }
    }
  • Diamond Problem
  • //Foo, Bar 둘다 default void printNameUpper()이 선언되어 있는 경우
    //두 인터페이스 중 누구것을 사용해야하는지 모르기 때문에 오류가 발생한다.
    public class Default implements Foo, Bar{..} 

    📒 スタティツクメソッド

  • の単純な機能を有する実用的な方法を提供する場合、インタフェースに静的方法を提供することができる.
  • 인터페이스이름.메소드이름()
  • を使用
  • 静的方法は、実施形態ではカバーできない.
  • public interface Foo{
    	static void printAnything(){
    		System.out.println("Foo");
    	}
    }
    
    
    public class App{
    	public static void main(String[] args){
    		Foo.printAnything(); //인터페이스를 바로 사용 가능
    	}
    }

    📒 プライベートメソッド


  • これはjava 9に追加された機能です.

  • インタフェースの内部メソッドを外部からアクセスさせたくない場合があります.

  • たとえば、defaultメソッドで使用されるメソッドへの外部アクセスを禁止できます.
  • public interface Boo {
    
        //interface 내부 메소드
        //외부에선 사용, 오버라이딩 등의 접근 자체가 불가능.
        private String printHello(){ 
            return "Hello";
        }
        
        default void Hello(){
            System.out.println(printHello()+" user!");
        }
    }

    Reference


    インフラストラクチャjava(白線)