6

私の理解によると

最終クラス

最終クラスは、単に拡張できないクラスです。

単一の引数のないプライベート コンストラクターを持つクラス

プライベート コンストラクターを持つクラスは、同じクラス内のフォームを除いてインスタンス化できません。これにより、別のクラスから拡張しても意味がありません。ただし、サブクラス化できないという意味ではありません。内部クラス間で、プライベート コンストラクターを拡張して呼び出すことができます。

したがって、私の理解では、単一の引数なしのプライベートコンストラクターでクラスを作成した場合、そのクラスを final として宣言する意味はありませんでは、引数のない単一のプライベートコンストラクターがあるのに、なぜJavaのシステムクラスが最終クラスとして宣言されているのでしょうか?

class finalを作成するとパフォーマンスが向上すると聞きました。これは正しいですか、これが System クラスを final として宣言する唯一の理由ですか? Java が System クラスをこのように実装した理由を明確にしてください。

4

1 に答える 1

4

場合によっては、いくつかの静的ユーティリティ メソッドを含む「ユーティリティ」クラスが必要になることがあります。これらのクラスは拡張される予定はありません。したがって、開発者は防御的な決定を下し、そのようなクラスを「最終」とマークする場合があります。Java クラスを「final」とマークすると、Hotspot のパフォーマンスがわずかに向上する可能性があります ( https://wikis.oracle.com/display/HotSpotInternals/VirtualCallsを参照してください)。しかし、それはパフォーマンスではなく設計上の決定だったと確信しています。

不変の値オブジェクトも必要な場合、またはクラスをファクトリ メソッドによってのみインスタンス化する場合は、最終クラスを使用できます。不変値オブジェクトは、同時実行性を扱うときに特に非常に役立ちます。

public final class MyValueObject {
   private final int value;
   private MyValueObject(int value) { this.value = value; }
   public static MyValueObject of(int value) { return new MyValueObject(value); }  
}

静的ファクトリ メソッドを使用すると、これらすべての構築の詳細をファクトリ メソッドの背後に隠すことができます。さらに、そのファクトリを介して、シングルトンのように、実行時のそのクラスのインスタンスの数を制御できます。

私が言ったように、これらはすべて設計上の決定です。最終クラスによってパフォーマンスが大幅に向上することはないと確信しています。

于 2015-05-15T11:48:20.667 に答える