プログラマーとして、私は仕事のインタビュー中にコーディングの問題にしばしば遭遇します。
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つのポイントを調べることに他なりません。
Jdk1.7の新機能を理解していますか
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つの重要なポイント:
リソースを含むtryステートメントによって管理されるリソースは、AutoCloseableインターフェイスを実装するクラスのオブジェクトである必要があります。
tryコードで宣言されたリソースは、暗黙的にfianlとして宣言されます。
各ステートメントをセミコロンで区切ることにより、複数のリソースを管理できます。
フォーマット:
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コードを長押しして識別してフォローしてください