タグ付けされた質問 「default-method」

15
使用するタイミング:Java 8+インターフェースのデフォルトメソッドと抽象メソッド
Java 8では、Default Methodsと呼ばれるインターフェースでメソッドのデフォルト実装が可能です。 私は(with )interface default methodではなく、そのようなをいつ使用するのか混乱しています。abstract classabstract method(s) では、デフォルトのメソッドとのインターフェースをいつ使用し、抽象クラス(抽象メソッドを含む)をいつ使用する必要があるのでしょうか。抽象クラスはそのシナリオでもまだ役に立ちますか?

5
Java 8インターフェイスメソッドで「最終」が許可されないのはなぜですか?
Java 8の最も便利な機能の1つは、defaultインターフェースの新しいメソッドです。それらが導入された理由は基本的に2つあります(他にもある場合があります)。 実際のデフォルト実装を提供します。例:Iterator.remove() JDK APIの進化を可能にする。例:Iterable.forEach() APIデザイナーの観点から、インターフェイスメソッドで他の修飾子を使用できるようにしたいと思っていましたfinal。これは、便利なメソッドを追加するときに役立ち、クラスの実装における「偶発的な」オーバーライドを防ぎます。 interface Sender { // Convenience method to send an empty message default final void send() { send(null); } // Implementations should only implement this method void send(String message); } 上記がSenderクラスの場合、すでに一般的な方法です。 abstract class Sender { // Convenience method to send an empty message final void …

4
Javaでデフォルトのメソッドを明示的に呼び出す
Java 8では、既存の実装を変更せずにインターフェースを拡張する機能を提供するデフォルトのメソッドが導入されています。 メソッドがオーバーライドされている場合、または異なるインターフェイスでデフォルト実装が競合しているために使用できない場合に、メソッドのデフォルト実装を明示的に呼び出すことができるかどうか疑問に思います。 interface A { default void foo() { System.out.println("A.foo"); } } class B implements A { @Override public void foo() { System.out.println("B.foo"); } public void afoo() { // how to invoke A.foo() here? } } 上記のコードを考慮してA.foo()、クラスBのメソッドからどのように呼び出しますか?

2
Java 8インターフェースメソッドで「同期」が許可されない理由は何ですか?
Java 8では、次のように簡単に記述できます。 interface Interface1 { default void method1() { synchronized (this) { // Something } } static void method2() { synchronized (Interface1.class) { // Something } } } クラスでも使用できる完全な同期セマンティクスを取得します。ただし、synchronizedメソッド宣言では修飾子を使用できません。 interface Interface2 { default synchronized void method1() { // ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here } static synchronized void method2() { …

5
Java8:java.lang.Objectからメソッドのデフォルトメソッドを定義することが禁じられているのはなぜですか
デフォルトのメソッドは、Javaツールボックスの優れた新しいツールです。しかし、私はを定義するインターフェイスを書いてみましたdefaulttoStringメソッドのバージョン。で宣言されたメソッドは編集java.lang.Objectできない可能性があるため、これは禁止されているとJavaは教えてくれdefaultます。これはなぜですか? 「基本クラスは常に勝つ」というルールがあることを知っているので、デフォルトでは(pun;)、 defaultObjectメソッドの実装はObjectとにかくメソッドによって上書きされます。ただし、Object仕様に記載されているメソッドの例外が存在してはならない理由はありません。特にtoString、デフォルトの実装があると非常に便利です。 それで、Javaデザイナーが許可しないことに決めた理由は何ですか defaultメソッドをオーバーライドメソッドをObjectですか?

1
特性としてのJava 8のデフォルトメソッド:安全?
デフォルトのメソッドを Java 8の貧困層の特性のトレイトとして使用することは安全な方法ですか? パンダをそれだけで使うと悲しいかもしれないと主張する人もいます。クールだからですが、それは私の意図ではありません。また、APIの進化と下位互換性をサポートするためにデフォルトのメソッドが導入されたこともよく思い出されますが、これは、それ自体を特性として使用することを間違ったり、歪ませたりするものではありません。 私が持っている以下の実用的なユースケースを念頭に置きました: public interface Loggable { default Logger logger() { return LoggerFactory.getLogger(this.getClass()); } } または、次のように定義しますPeriodTrait。 public interface PeriodeTrait { Date getStartDate(); Date getEndDate(); default isValid(Date atDate) { ... } } 確かに、コンポジションを使用することもできます(ヘルパークラスを使用することもできます)が、より冗長で雑然としており、ポリモーフィズムの恩恵を受けることができません。 では、デフォルトのメソッドを基本的な特性として使用しても問題ありませんか?それとも、予期しない副作用について心配する必要がありますか? SOに関するいくつかの質問は、JavaとScalaの特性に関連しています。それはここでのポイントではありません。私も単に意見を求めるのではありません。代わりに、私は信頼できる回答または少なくともフィールドインサイトを探しています。企業プロジェクトの特性としてデフォルトの方法を使用した場合、それは時限爆弾であることが判明しましたか?

4
デフォルトのメソッドを持つインターフェースはいつ初期化されますか?
この質問に答えるためにJava言語仕様を検索しているときに、 クラスを初期化する前に、その直接のスーパークラスを初期化する必要がありますが、クラスによって実装されるインターフェースは初期化されません。同様に、インターフェイスのスーパーインターフェイスは、インターフェイスが初期化される前に初期化されません。 私自身の好奇心から、試してみましたが、予想通り、インターフェースInterfaceTypeが初期化されていませんでした。 public class Example { public static void main(String[] args) throws Exception { InterfaceType foo = new InterfaceTypeImpl(); foo.method(); } } class InterfaceTypeImpl implements InterfaceType { @Override public void method() { System.out.println("implemented method"); } } class ClassInitializer { static { System.out.println("static initializer"); } } interface InterfaceType { public …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.