3

私はJava 8の機能に非常に慣れていないため、デフォルトのメソッドを理解しようとしています. 匿名クラスを使用するよりも、同じインターフェイスの別のデフォルト メソッドによってデフォルト メソッドを呼び出す簡単な方法はありますか? 例えば:

public class Frame{

    public static void main(String... args){
        Frame.C c= new Frame.C();
        c.doSomething();
    }

    public interface A{
        public default void doSomething(){
            System.out.println("A");
        }
    }

    public interface B extends A {
        @Override
        public default void doSomething(){
            System.out.println("B");

            //is there an easier way to invoke that method??
            new B(){}.other();
        }
        default public void other(){
            //doSomething();
            System.out.println("other");
        }
    }

    public static class C implements B{
        @Override 
        public void other(){
            Lambda.B.super.other();
            System.out.println("C");

        }
    }

}
4

1 に答える 1

4

あなたの意図は完全には明らかではありませんが、構造は次のnew B(){}.other();2 つのことを意味します。

  1. オーバーライド メソッドの実装を呼び出したくない
  2. other()まったく別のインスタンス ( new B(){}) で呼び出すことが実行可能な解決策である場合、呼び出すインスタンスは明らかに無関係です。

staticこれら 2 つのことは、代わりにメソッドを使用する必要があることを意味します。

public interface B extends A {
    @Override
    public default void doSomething(){
        System.out.println("B");

        otherInB();
    }
    default public void other(){
        otherInB();
    }
    static void otherInB() {
        //doSomething();
        System.out.println("other");
    }
}

元のメソッド名には有用な情報が含まれていないため、そのstaticメソッドに有用な名前を提案することもできません。

Java 9privateでは、インターフェイスでメソッドのサポートが導入されることに注意してください。これによりotherInB()、他のクラスに隠れたりstatic、同じインスタンスで他のメソッドを使用する必要がある場合に非表示にすることさえできます。

Java 8 でのメソッドの可視性が問題になる場合は、非ポリモーフィック メソッドの実際の場所は無関係であるため、常にコンパニオン クラスを使用できます。

public interface B extends A {
    @Override
    public default void doSomething(){
        System.out.println("B");

        BHelper.other();
    }
    default public void other(){
        BHelper.other();
    }
}

…</p>

/* not public */ class BHelper {
    /* not public */ static void other() {
        //doSomething();
        System.out.println("other");
    }
}

Bこれは、パラメーターとして渡すことができるため、実装が実際のインスタンスを必要とする場合でも機能します。

public interface B extends A {
    @Override
    public default void doSomething(){
        System.out.println("B");

        BHelper.other(this);
    }
    default public void other(){
        BHelper.other(this);
    }
}

…</p>

/* not public */ class BHelper {
    /* not public */ static void other(B instance) {
        //doSomething();
        System.out.println("other");
    }
}
于 2016-02-25T10:11:23.950 に答える