決勝でJavaは、最終的には、違いが何であるかを確定しますか?

決勝でJavaは、最終的には、違いが何であるかを確定しますか?これは、Javaのインタビューは頻繁に、彼らは本当に何が違うの質問をしたのですか?

3は、実際には、ちょうどそこ千葉関係カスペルスキーやパキスタンなどの関係を非常によく似ています。

もしそうなら、それに答えるためにどのように質問を?まず、ビューの文法と用法点から三つの異なる可能性出発の簡単な紹介:

  • 膨張を継承することができず、最終的な変数を修正することができず、最終的な方法は、(オーバーライド)がオーバーライドされていない最終的な修飾クラスを表す、最終的なクラス、メソッド、変数、異なる意味を持つそれぞれを修正するために使用することができます。
  • 最終的メカニズムは、フォーカスが実行されなければならないJavaコードであることを確認します。あなたは最終的に試すかのtry-catch-最終的にロック解除ロック動作を保証するために、同様のへのJDBC接続を閉じることができます。
  • 最終決定は、ガベージコレクトされる前に、特定のターゲット・リソースの完全な回復を確実にするために設計された基本クラスjava.lang.Objectの方法です。最終決定のメカニズムは今JDK 9で非推奨と非推奨としてマークされるようになったされています。

ここでの唯一の答えは、何の明るいスポットはないであろう場合は、我々はさらに、このようなパフォーマンスから収集し、他の基本的なプロセス、並行性、オブジェクトのライフサイクルなど、さまざま3の詳細なプレゼンテーションを、行くか、自分の理解について話すことを拒否することができます。

最後の

以下のようなコードの意味的、論理的な意図を、クリアすることができ、最終的なキーワードを使用します。

あなたは明確にこれらの行為を変更することはできません、他の人に伝えることができるようにメソッドやクラスは、finalとして宣言することができます。
Javaのクラスの多くは、次のようにjava.langパッケージなどのコアライブラリやソースコードの定義、かなりの部分が、このような私たちの共通のStringクラスとして、最終的なクラスを、であると宣言され、同じことがどのできる、サードパーティのライブラリのいくつかの基底クラスで真であります効果的にある程度、基本となるAPIの機能を変更するには、ユーザーを防ぐため、プラットフォームの安全性を確保するために必要な手段です。

パラメータまたは変数の最終修正もプログラミングエラーによる事故を避けるために明確に割り当てることができます使用し、でも、それが明示的にすべてのメソッドパラメータ、ローカル変数、メンバ変数をfinalとして宣言することを推奨されていました。

最終的な変数が不変(不変)効果のある程度を生成し、従って、明らかにもはや最終的な変数を割り当てていないので、それは、追加の同期オーバーヘッドを減らすために役立ち、特に並行プログラミングで、読み取り専用データを保護するために使用することができますまた、必要に応じて、いくつかの防御的なコピーを保存します。

多くの記事や書籍を有することができる最終的な性能のいいところは、例えば、最終メソッドのインライン化を使用してJVMに寄与することができる、特定のシナリオでのパフォーマンスを改善するために導入され、コンパイラは、条件付きコンパイルなどの能力を向上させることができます。私は記事を紹介する前に、あなたが表示し、クリックすることができます知ってほしいです。

さらに読書:Javaのfinalキーワードの深い理解

最終的かつ不変

実際には、前述した最終的な利点は、例えば、次のコードとしてではなく、同じ不変最終的に、それを指摘します。

final List<String> strList = new ArrayList<>();
strList.add("wupx");
strList.add("huxy");  
List<String> loveList = List.of("wupx", "huxy");
loveList.add("love");

唯一の制約最終strListこの参照は割り当てることができないが、strListオブジェクトの動作は、このような動作が完全に正常であるような要素を追加し、影響を与え、最終的ではありません。私たちは本当にオブジェクト自体は不変である場合は、適切なクラスは不変の動作をサポートする必要があります。上記の例では、List.of方法は、自分自身を作成し​​、追加最後の文は、例外が実行時にスローされますされ、不変の一覧です。

多くのシーンで不変の意味での大きな選択は、ある、ない不変のサポートは、あなたが不変クラスを実現したい場合は、私たちが行う必要があり、存在しないJavaのネイティブ言語:

他の人が制限を回避するために拡張することができないように、クラス自体は、finalとして宣言されています。

すべてのメンバ変数は、プライベートとfinalとして定義され、およびsetterメソッドを理解していません。

あなたが入力オブジェクトが他の人によって変更されていないかを決定することはできませんので、通常オブジェクトが構築されると、むしろ直接割り当てよりも、初期化するために、深さコピーメンバ変数を使用して、これは、防衛策です。

あなたはgetterメソッドが必要です、または他の方法は、実装の内部状態を返す可能性がある場合は、上の書き込み原理コピーの使用は、プライベート・コピーを作成します。

すべてが直接IDEやロンボク島で多くの人々を生成ようにセッター/ゲッターメソッドについては、それが必要なときを決定するのがベストだろう実現。

最後に

最終的には、十分に使用する方法を知っています。また、コードの量を減らすことができ、接続やその他のリソースをクローズする必要がありますが、異常な状況を処理するために、通常のJavaプラットフォームは良くできているため、Javaの7に追加してみてください - と - リソースステートメントを使用することをお勧めします。

また、最終的に問題をテストするために、多くの場合があります。たとえば、次のコードが出力されますでしょうか?

try {
  // do something
  System.exit(1);
} finally{
  System.out.println("Hello,I am finally。");
}

try-catchが予期せず終了するので、コード内の最後に上記は、実行されません。

他の最後に実行されるコードの場合のように含まれていません。

// 死循环
try{
    while(ture){
        System.out.println("always run");
    }
}finally{
    System.out.println("ummm");
}

// 线程被杀死
当执行 try-finally 的线程被杀死时,finally 中的代码也无法执行。

完成させます

確定するには、Javaの9で使用することは推奨されていない、それは)(Object.finalizeをされて、非推奨としてマークされています。

なぜ?期待に沿って実行するかどうかの実装を確定する保証は、ありませんので。不適切な使用は、その上のハングやデッドロックにつながる、パフォーマンスに影響を与えることができます。

一般的には、上記と資源-てみたりしてみてください、最終的メカニズムの使用は、資源をリサイクルするために非常に良い方法です。あなたは、追加の治療、または他のメカニズムを必要とした場合はJavaへのクリーナーの代替提供して考えることができます。

なぜ、ファイナライズをお勧めしませんか?

それを使用することは推奨されませんなぜ確定する簡単な紹介の前に、推奨されませんか?

  1. ガベージコレクションに関連した実行を確定、finalizeメソッドいったん非空を達成するために、対応するオブジェクトは、大きさの提示順序の緩やかな回復が発生します。
  2. 最終決定は、オブジェクトが追加処理へのごみ収集、JVMそれをされる前に呼び出されるように設計されています。、急速な回復にブレーキとなってリサイクルすることができ、ガベージコレクションサイクルの数によって対象につながる可能性があり、本質的に仕上げます。
  3. 多数のオブジェクトの蓄積につながる、ガベージコレクションを遅らせる確定、それがOOMの代表的な原因です。
  4. 資源が限られているので、予測不可能なガベージコレクションの時間を資源の回復を確実にするために、大幅にリソース消費を悪化させることができます。
  5. リサイクル時に不明瞭なエラーメッセージを最終決定。

だから、資源の消費量の非常に高い周波数のために、リリースされた主な責任を取るためにリソースを確定することを期待しないでください。可能な限り再利用するために明示的に解放またはプールのリソースを参照して実行されている推奨されるリソース。

以下の実施例は、リサイクル時に、不明瞭なエラーメッセージを最終決定者は、ソースコードのjava.lang.ref.Finalizerを見てみましょう与えられます。

private void runFinalizer(JavaLangAccess jla) {
    //  ... 省略部分代码
    try {
        Object finalizee = this.get(); 
        if (finalizee != null && !(finalizee instanceof java.lang.Enum)) {
           jla.invokeFinalize(finalizee);
           // Clear stack slot containing this variable, to decrease
           // the chances of false retention with a conservative GC
           finalizee = null;
        }
    } catch (Throwable x) { }
        super.clear(); 
}

任意の有用な情報を得ることはありません、前に見た友人がすぐに異常か間違ってたら意味し、Throwableのが飲み込まれ見ることができるはず品の異常を説明します。

さらに読書:20回のベストプラクティスのJavaの例外処理は、あなたは、いくつかを知っていますか?

それを最終決定するためのより良い選択肢はありますか?

現在使用されているJavaプラットフォームはjava.lang.ref.Cleaner徐々に本来のファイナライズの実装に置き換えます。掃除機は、一般的な、いわゆる死後のクリーンアップ機構であるファントムの値動き(PhantomReference)を用いて実装されます。オブジェクトが完全に破壊される前に、ファントム参照と参照キューを使用して、そのようなファイルディスクリプタ(リソースの限られたオペレーティングシステム)を閉じると、何か同様のリサイクル作業を行うことを保証することができ、それはより軽量ファイナライズよりも信頼性が高いです。

各クリーナー操作はそうなデッドロックなどの予期しない問題を回避するため、独自の実行中のスレッドで、独立しています。

私たちは、彼らのクリーナーのためのモジュールをビルドした後、次のように適切なクリーニングロジック、特定のコードを実装することができます:

/**
 * Cleaner 是一个用于关闭资源的类,功能类似 finalize 方法
 * Cleaner 有自己的线程,在所有清理操作完成后,自己会被 GC
 * 清理中抛出的异常会被忽略
 * 
 * 清理方法(一个 Runnable)只会运行一次。会在两种情况下运行:
 * 1. 注册的 Object 处于幻象引用状态
 * 2. 显式调用 clean 方法
 * 
 * 通过幻象引用和引用队列实现
 * 可以注册多个对象,通常被定义为静态(减少线程数量)
 * 注册对象后返回的Cleanable对象用于显式调用 clean 方法
 * 实现清理行为的对象(下面的 state),不能拥有被清理对象的引用
 * 如果将下面的 State 类改为非静态,第二个 CleaningExample 将不会被 clean,
 * 因为非静态内部类持有外部对象的引用,外部对象无法进入幻象引用状态
 */
public class CleaningExample implements AutoCloseable {

    public static void main(String[] args) {
        try {
            // 使用JDK7的try with Resources显式调用clean方法
            try (CleaningExample ignored = new CleaningExample()) {
                throw new RuntimeException();
            }
        } catch (RuntimeException ignored) {
        }

        // 通过GC调用clean方法
        new CleaningExample();
        System.gc();
    }

    private static final Cleaner CLEANER = Cleaner.create();

    // 如果是非静态内部类,则会出错
    static class State implements Runnable {
        State() {
        }

        @Override
        public void run() {
            System.out.println("Cleaning called");
        }
    }

    private final State state;
    private final Cleaner.Cleanable cleanable;

    public CleaningExample() {
        this.state = new State();
        this.cleanable = CLEANER.register(this, state);
    }

    @Override
    public void close() {
        cleanable.clean();
    }

}

その状態に入ることができない外部オブジェクトの錯覚を占めるようになるので、その中でも、国家が静的として定義され、通常の内部クラスを避けるためであることは、外部のオブジェクトへの強い参照を意味します。

予測可能性の度合いの観点から裁判官に、クリーナーやファントムはファントム参照の蓄積につながるさまざまな理由でも問題が発生した場合の改善は、まだ限られている引用しました。だから、クリーナーは、クリーナー資源循環だけに頼るのではなく、確実に最後の手段として適しています。

概要

この記事では、最終的には、安全性、パフォーマンス、ガベージコレクションなどの面で見ると、言語の点から、徐々に深さに仕上げる最終から最初に分析し、詳細に最終の違いを説明し、最後に、3を確定。
ファイル

おすすめ

転載: www.cnblogs.com/wupeixuan/p/11756472.html