2017-01-18 22 views
0

APIを設計するときに、インターフェース(1つの抽象メソッドを含むように起こる)に "@ FunctionalInterface"という注釈を付けることがあるという警告に直面することがよくあります。なぜ@NotFunctionalInterfaceはありませんか?

それは多くの場合だけでなく、このようなもので、カスタムリスナー(ややActionListenerのような)で発生:すべてのこれらのインターフェースは、共通している

public interface CommunicatorEnumerator { 
    List<Communicator> enumerateCommunicators(); 
} 

ことの一つは、誰かが追加されることを排除するものではないということです将来のより抽象的な方法。理想的には、このようなインターフェイスがlambdaで使用されないようにしたいのです。

@SuppressWarnings("InterfaceMayBeAnnotatedFunctional")を持つと、ラムダの使用が妨げられません。私はそれらを「機能していないインターフェイス」とマークしたいと思います。

なぜ、インターフェイスのラムダ使用を妨げる構造(アノテーションである必要はありません)がありませんか?

+5

を拡張心配、それは適用されません。警告を無効にしないだろうとにかくあなたのAPIを壊してしまっています(インターフェイスを実装している誰でもメソッドを追加する必要があります)。 – Jesper

+0

サブインターフェースを持つFunctionalInterfaceをさらに多くのメソッドで拡張することができます。これはあなたのIDEでの単なる警告です、あなたはそれをオフにすることができます。 –

+2

@マークこれについての使用例はありません。 クライアントコードでクラスを使用できないようにするには、可視性修飾子を使用します(パッケージをプライベートにするか、外部型でラップする場合はクラスプライベートにすることができます)。 API *内でクラス*の使用を拒否するには、開発者がコード自体に完全にアクセスでき、必要な変更を行うことができます。意図した用途を文書化するだけかもしれませんが、それはそれです。 –

答えて

0

これはIDEによる警告です。これをオフにするか、選択的に無効にする必要があります。

@ FunctionalInterfaceを使用しても拡張はできません。

@FunctionalInterface 
public interface ISuper { 
    void methodOne(); 
} 
public interface ISub extends ISuper { 
    void methodTwo(); 
} 

public enum Sub implements ISub{ 
    INSTANCE { 
     @Override 
     public void methodTwo() { 
      System.out.println("Wave Two"); 
     } 

     @Override 
     public void methodOne() { 
      System.out.println("Wave One"); 
     } 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
    ISuper sup =() -> System.out.println("Hi"); 
    sup.methodOne(); 

    Sub.INSTANCE.methodOne(); 
    Sub.INSTANCE.methodTwo(); 

    ISub sub = new ISub() { 
     @Override 
     public void methodTwo() { 
      System.out.println("Bye"); 
     } 

     @Override 
     public void methodOne() { 

     } 
    }; 
    sub.methodTwo(); 
    } 
} 

プリント

Hi 
Wave One 
Wave Two 
Bye 

私は、あなたがインターフェイスに(デフォルト以外の)メソッドを追加する場合@FunctionalInterface

+0

'@ FunctionalInterface'のインターフェースを拡張できることは別のデザインの特色ですが、オープンしようとは考えていないワームの可能性があります。それは私が尋ねたことではない。 –

関連する問題