请查看以下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
方法,但是肯定不起作用,因为它不可能将ResultSet
或Statement
投射到MyAutoCloseable
。
答案 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();
}
}