コードのクリーンさの観点から、このコードを最適化する余地はありますか?

プログラマーとして、私は仕事のインタビュー中にコーディングの問題にしばしば遭遇します。

Zhang GongはJavaプログラマーです。最近、彼は有名なインターネット会社とのインタビューに行きました。インタビュアーは次の質問をしました。

コードのクリーンさの観点から、このコードを最適化する余地はありますか?最適化する方法は?

  public static void writeFile(String str) {
    FileWriter fw = null;
    try {
        fw = new FileWriter("e://1.txt", true);
        fw.write(str);
    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        if (fw != null) {
            try {
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Gong Zhangがプログラムを詳しく調べたところ、プログラム自体に問題はないことがわかりました。コードのクリーンさの観点からは、かなり標準的でした。

だから「問題ない」と言って

インタビュアー:あなたは通常このように書きますか?

張功:はい

インタビュアー:このコードは非常に読みやすいと思いますか?

Zhang Gong:悪くないです。

インタビュアー:jdk1.7の新機能を知っていますか?

Zhang Gong:わかりました。

インタビュアー:私が尋ねたことはこれに関連しています。

インタビュアーがそう言ったとき、張さんは恥ずかしかった。

実際、インタビュアーがこの質問をするとき、それは2つのポイントを調べることに他なりません。

  1. Jdk1.7の新機能を理解していますか

  2. try()... catch()を使用すると、コードを閉じるロジックがより冗長になります

JDK1.7より前は、通常try ... catch()を使用して例外をキャッチします。同様のIOストリーム処理が発生した場合、通常はIOストリームの最後の部分を閉じますが、JDK1.7の後、Java7がコンパイルされます。プロセッサと動作環境は、ARMブロック(自動リソース管理)と呼ばれる新しいtry-with-resourcesステートメント、自動リソース管理をサポートしています。()で記述されたストリームオブジェクトに対応するクラスはすべて、AutoCloseableインターフェイスを実装します。

1つは、AutoCloseableを認識します

AutoCloseableインターフェイスはjava.langパッケージにあり、JDK1.7以降に導入されました。

JDK1.7より前は、try {} finally {}を通じてfinallyでリソースをリリースしていました。最終的にリソースを閉じるには、次の問題があります。

  • 開発者は、終了ロジックを実行するために手動でコードを作成する必要があります。

  • 一部のリソースを閉じるのを忘れて、メモリリークが発生する場合があります。

  • コードを閉じるロジックは冗長であり、コードは読みにくいです。

JDK1.7以降、AutoCloseableインターフェイスを実装するクラスのインスタンスの場合、tryの後に配置します(これをtryステートメントとリソースと呼びます)。tryが終了すると、これらのリソースは自動的に閉じられます(closeメソッドを呼び出します)。 )。

リソースを使用したtryステートメントの3つの重要なポイント:

  1. リソースを含むtryステートメントによって管理されるリソースは、AutoCloseableインターフェイスを実装するクラスのオブジェクトである必要があります。

  2. tryコードで宣言されたリソースは、暗黙的にfianlとして宣言されます。

  3. 各ステートメントをセミコロンで区切ることにより、複数のリソースを管理できます。

フォーマット:

try (创建流对象语句,如果多个可以使用';'隔开) {

// dosomething

 } catch (IOException e) {

   e.printStackTrace();

  }
}

JDK1.7より前

JDK1.7以降

JDK1.7以降、shutdownメソッドを使用すると、最終的にデータを閉じる必要はありません。リソースを閉じるためのコードを書く必要はありません

これらのクローズ可能なリソースは、java.lang.AutoCloseableインターフェイスを実装する必要があります

たとえば、FileWriterをtry()に配置します

 public static void writeFile(String str) {
    try (FileWriter fw = new FileWriter("e://1.txt", true)) {
        fw.write(str);
    } catch (Exception e) {
        e.printStackTrace();
    }
  }

フォローアップしてFileWriterを見てみましょう。OutputStreamWriterに継承されていることがわかりました

クリックしてOutputStreamWriterを表示します。Writerが実装されていることがわかりました

次に、クリックしてWriterを表示します。Closeableが実装されていることがわかりました

クリックしてCloseableを表示します。AutoCloseableが実装されていることがわかりました

CloseableはAutoCloseableを継承していることがわかり、リソースで閉じるという基本的な要件が満たされます。tryの{}が実行されると、リソースは自動的に閉じられます。

作者のレベルが限られているため、記事の不備は避けられず、私は提案する権利があります。不正を批判し、訂正してください。

最近お勧め

インタビュアー:あなたは3年間働いていますが、データマッチングルールをマスターしてみませんか?

さらにサプライズが必要な場合は、QRコードを長押しして識別してフォローしてください

おすすめ

転載: blog.csdn.net/X8i0Bev/article/details/107872852