将对象强制转换为未实现但具有相同方法签名的接口

时间:2017-07-14 09:03:29

标签: java jdbc casting dry autocloseable

请查看以下DbUtil课程示例。这里有三个方法

public static void closeResults(ResultSet rs) {
    if (rs != null) {
        try {
            if (!rs.isClosed()){
                rs.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

public static void closeStatement(Statement stmt) {
    if(stmt != null) {
        try {
            if (!stmt.isClosed()) {
                stmt.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

public static void closeConnection(Connection conn) {
    if(conn != null) {
        try {
            if(!conn.isClosed()) {
                conn.close();    
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

正如您所看到的,所有3种方法都具有相同的逻辑,我想将此代码设为DRY。可以像这样编写一种新的通用方法

public static void closeStatement(AutoCloseable ob) {
    if(ob != null) {
        try {
            ob.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

AutoCloseable接口不包含isClosed方法。但在尝试关闭资源之前执行该检查仍然是一种很好的做法(甚至必须这样做)。我对吗?可以以某种方式简化代码并仍然执行isClosed检查吗?

请注意。这只是问题的一个例子。我知道AutoCloseable接口是为try-with-resources技术而设计的,因此可以用该样式重写代码,并且不再需要DbUtil。但我想澄清一下,在类似情况下甚至可以做些什么。例如,我会考虑创建一些界面,比如MyAutoCloseable,扩展AutoCloseable一个并使用isClosed方法,但是肯定不起作用,因为它不可能将ResultSetStatement投射到MyAutoCloseable

2 个答案:

答案 0 :(得分:1)

您根本不需要致电 /** * Get group name * * @param int $no_of_participant * @return string */ public static function getGroupName(int $no_of_participant) { $groupNameArry = array(); $groupNumber = 0; $letters = range('A', 'Z'); foreach ($letters as $letter) { for ($i = 0; $i <= $no_of_participant / 2; $i++) { if ($i == 0) { $groupNameArry[$groupNumber] = $letter; } else { $groupNameArry[$groupNumber] = $letter . $i; } $groupNumber++; } } return $groupNameArry; } 。我在JDK中见过的所有 var values = new Dictionary<string, string> { { "kod", "111" }, { "id_user", user.Id }, { "image", encodedFile }, { "title", "MyText" }, { "text", "1234526" } }; var content = new System.Net.Http.FormUrlEncodedContent(values); var response = await client.PostAsync("http://MyUri/tape.php", content); var responseString = await response.Content.ReadAsStringAsync(); 方法都是幂等的,这意味着你可以在没有伤害的情况下将其称为两次或更多次。

答案 1 :(得分:0)

您可以使用反射来实现它。

public static void close(Object obj)
{
    try
    {
        Class<?> c = obj.getClass();
        Method isClosed = c.getDeclaredMethod("isClosed");// No I18N
        if( (Boolean)isClosed.invoke(obj) )
        {
            Method close = c.getDeclaredMethod("close");
            close.invoke(obj);
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}