)(クローズを使ってどのように優雅に?

注意:この記事はブロガーから来ている:chloneda

この記事のソースリンクhttps://www.cnblogs.com/chloneda/p/java-close.html

close()メソッドの私たち本当にエレガント使用するように可能な限り理解しやすいこの記事で、段階的なアプローチ、!

問題のシナリオ

通常、我々は通常()メソッドを閉じてリソースを閉じてリソースを使用しますが、このステップは非常に高い再現性である、また、実行順序の未知のリスクに直面し、多くの人が合理的にまだ正常にシャットダウンしない資源です。

我々は見て近い()どのように誤ってシャット資源であるがかかりますか?

間違っ近いです()

のは、リソースの道をオフにし、次のエラーを見てみましょう:

package com.chloneda.jutils.test;

import java.sql.*;

/**
 * @author chloneda
 * @description: close()方法测试
 * 错误的close()
 */
public class CloseTest {
    public static void main(String[] args) {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            //1.加载驱动程序
            Class.forName("com.mysql.jdbc.Driver");
            //2.获得数据库链接
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/common", "root", "123456");
            //3.通过数据库的连接操作数据库,实现增删改查
            st = conn.createStatement();
            rs = st.executeQuery("select * from new_table");
            //4.处理数据库的返回结果
            while (rs.next()) {
                System.out.println(rs.getString("id") + " " + rs.getString("name"));
            }
            //5.关闭资源
            rs.close();
            st.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

(closeメソッドが呼び出されると、例えばリソースが前に、tryブロックで記述されたコードの上に閉じて3段階)リソースのコードが実行されることはありません閉じ、例外をスローします。

我々はそうすることを最終的に銀行にリソースコードを閉じた場合は?

    try {
        //1.加载驱动程序
        Class.forName("com.mysql.jdbc.Driver");
        //2.获得数据库链接
        conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/common", "root", "123456");
        //3.通过数据库的连接操作数据库,实现增删改查
        st = conn.createStatement();
        rs = st.executeQuery("select * from new_table");
        //4.处理数据库的返回结果
        while (rs.next()) {
            System.out.println(rs.getString("id") + " " + rs.getString("name"));
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        //5.关闭资源
        try {
            rs.close();
            st.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

答えはノーです!場合は2ステップでCONNデータベース・リンクに取得しようとするが例外をスローし、それがconnがヌルである、まだある、finallyブロックが近い()を実行するには、この時間は、それがnullポインタ例外を報告し、そしてリソースが意味をなさない閉じ!したがって、我々はそれがクローズする必要があるときだけ空いていない、など、それが空connがあるかどうかを判断する前に)(閉じる必要があります。

コモン近いです()

上記のシナリオのために、次のように)(共通のクローズを使用して得られました:

/**
 * @author chloneda
 * @description: close()方法测试
 * 常见的close()
 */
public class CloseTest {
    public static void main(String[] args) {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            //1.加载驱动程序
            Class.forName("com.mysql.jdbc.Driver");
            //2.获得数据库链接
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/common", "root", "123456");
            //3.通过数据库的连接操作数据库,实现增删改查
            st = conn.createStatement();
            rs = st.executeQuery("select * from new_table");
            //4.处理数据库的返回结果
            while (rs.next()) {
                System.out.println(rs.getString("id") + " " + rs.getString("name"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //5.关闭资源
            if (null != rs) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (null != st) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (null != conn) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

        }
    }
}

これは、()共通近いです!しかし、ブロックが高すぎる多くのリソースがある場合は、最後に、それはちょうど、3つのリソースをシャットダウンし、コードの繰り返しは最終的に、多くのコードを記述する必要がされていないに閉鎖する必要はエレガントではないでしょうか?実際には、近いリソースは何も論理的なコードで、我々は、コードを繰り返し、優雅にプログラミングを減らすために、コードを合理化する必要があります!

AutoCloseableインタフェースを使用してください

Java7以来、我々は使用することができますAutoCloseableインタフェースは、リソースの変形例のエレガントな外観に近い(閉鎖可能インターフェースもすることができます):

/**
 * @author chloneda
 * @description: close()方法测试
 * 使用AutoCloseable接口
 */
public class CloseTest {
    public static void main(String[] args) {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            //1.加载驱动程序
            Class.forName("com.mysql.jdbc.Driver");
            //2.获得数据库链接
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/common", "root", "123456");
            //3.通过数据库的连接操作数据库,实现增删改查
            st = conn.createStatement();
            rs = st.executeQuery("select * from new_table");
            //4.处理数据库的返回结果
            while (rs.next()) {
                System.out.println(rs.getString("id") + " " + rs.getString("name"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //5.关闭资源,调用自定义的close()方法
            close(rs);
            close(st);
            close(conn);
        }
    }

    public static void close(AutoCloseable closeable) {
        if (closeable != null) {
            try {
                closeable.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

コードの量は、最終的に上記のコードブロックは、数を減らすことではなく、単に静的呼び出し近い(AutoCloseableの閉鎖可能な)方法。なぜこれが起こることができますか?

実際の接続、ステートメントでは、ResultSetの3つのインタフェースが継承するAutoCloseableのインターフェイスをだから、それは資源に来る閉じ、AutoCloseableインタフェースは、close()メソッドを可能に継承され、我々は呼び出すことができます(AutoCloseableの閉鎖可能)近いリソースをクローズする方法。

また、多くのクラスのJavaのIOストリームが実装閉鎖可能インターフェース、および開閉可能なインターフェースからも継承しAutoCloseableのインターフェイスを、あなたはまた、上記の呼び出すことができます近い(AutoCloseable閉鎖可能)リソースをクローズする方法を。ああ目覚めませんか?

トライして、リソースを使用します

実際には、Java7後、ある資源、閉鎖する方法があるのtry--リソースとを、このアプローチは、私たちのお勧めです!非常にエレガント!

リソースをシャットダウンする方法正常であることを見てみましょう!

/**
 * @author chloneda
 * @description: close()方法测试
 * 使用try-with-resources
 */
public class CloseTest {
    public static void main(String[] args) throws ClassNotFoundException {
        //1.加载驱动程序
        Class.forName("com.mysql.jdbc.Driver");
        try (//2.获得数据库链接
             Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/common", "root", "123456");
             //3.通过数据库的连接操作数据库,实现增删改查
             Statement st = conn.createStatement();
             ResultSet rs = st.executeQuery("select * from new_table")
        ) {
            //4.处理数据库的返回结果
            while (rs.next()) {
                System.out.println(rs.getString("id") + " " + rs.getString("name"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

この方法では、最終的には、リソースのクローズを繰り返すことなく、コードを書く省略されています!そして、資源もシャットダウンされています!どのようにこの問題を確認するには?あなたは底面閲覧できますの実用セクションを!

実際には、トライして、リソースは、基本的に継承され、オペレーティングリソースを閉じするjava.lang.AutoCloseableインターフェースので使用し、closeメソッドを達成してみてください-と-リソースリソースを閉じることができます。それは素晴らしいです!

実用化

このセクションでは、使用して検証されるのtry--リソースとのリソースの問題を閉じることができます!

我々が使用することを述べた上でトライして、リソースを継承している限り、リソースをクローズするjava.lang.AutoCloseableインターフェース近いを達成()メソッドを使用することができます!

私たちは、リソースクラスをカスタマイズし、それの実用化を見てみましょう!

package com.chloneda.jutils.test;

/**
 * @author chloneda
 * @description: 资源类, 实现AutoCloseable接口.
 */
public class Resources implements AutoCloseable {
    public void useResource() {
        System.out.println("useResource:{} 正在使用资源!");
    }

    @Override
    public void close() {
        System.out.println("close:{} 自动关闭资源!");
    }
}

/**
 * @description: 使用try-with-resources自动关闭资源测试.
 */
class AutoClosableTest {
    public static void main(String[] args) {
        /** 使用try-with-resource,自动关闭资源 */
        try (
                Resources resource = new Resources()
        ) {
            resource.useResource();
        } catch (Exception e) {
            e.getMessage();
        } finally {
            System.out.println("Finally!");
        }
    }
}

結果出力。

useResource:{} 正在使用资源!
close:{} 自动关闭资源!
Finally!

あなたはまだ結果を参照してください?リソースAutoCloseableクラスがインタフェース、close()メソッドを実装して、試して-と、リソースは自動的にリソースをシャットダウンします!

いったんリソースクラスが継承していないjava.lang.AutoCloseableインターフェースを close()メソッドを達成していない、AutoClosableTestモジュールがコンパイルエラーでクラスをしようと、システムが要求されます。
`Incompatible types. Required: java.lang.AutoCloseable Found: com.chloneda.jutils.test.Resources

最後の言葉

そこで、我々は、使用することをお勧めのtry-と資源正常シャットリソースを!


おすすめ

転載: www.cnblogs.com/chloneda/p/java-close.html