1 回答
TA贡献1848条经验 获得超6个赞
因为您必须捕获或抛出,Exception
并且必须确保不在块之后AutoCloseable.close()
执行任何操作,因为它没有超出范围,就像直接实现一样。我仍然同意其他人的观点,即这个解决方法非常好。context
try
InitialDirContext
AutoCloseable
当然,您也可以扩展InitialDirContext
并使其AutoCloseable
直接实现,或者(对于最终类)使用委托者模式并包装目标对象。
package de.scrum_master.stackoverflow;
import javax.naming.NamingException;
import javax.naming.directory.InitialDirContext;
import java.util.Hashtable;
import java.util.Properties;
public class TryWithResourcesAutoCloseableWrapper {
public static void main(String[] args) throws NamingException {
final Properties props = new Properties();
props.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory");
variant1(props);
variant2(props);
variant3(props);
}
public static void variant1(Properties props) throws NamingException {
final InitialDirContext context = new InitialDirContext(props);
try (final AutoCloseable dummy = context::close) {
lookupMX(context);
}
catch (NamingException ne) {
throw ne;
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void variant2(Properties props) throws NamingException {
final InitialDirContext context = new InitialDirContext(props);
try (final MyCloseable dummy = context::close) {
lookupMX(context);
}
}
public static void variant3(Properties props) throws NamingException {
try (final MyInitialDirContext context = new MyInitialDirContext(props)) {
lookupMX(context);
}
}
private static void lookupMX(InitialDirContext context) throws NamingException {
System.out.println(context.getAttributes("scrum-master.de", new String[] { "MX" }));
}
public interface MyCloseable extends AutoCloseable {
void close() throws NamingException;
}
public static class MyInitialDirContext extends InitialDirContext implements AutoCloseable {
public MyInitialDirContext(Hashtable<?, ?> environment) throws NamingException {
super(environment);
}
}
}
关于如何使用这些解决方法的更多想法:
两者
variant1
都是以块内的对象variant2
为代价的,除非您首先将它们投射到块内,否则您将永远不会使用它们。当然,您可以直接使用外部对象,这也是您所建议的。dummy
try
InitialDirContext
context
在
variant3
自动关闭context
对象中直接具有正确的(子)类型,因此您实际上可以无缝地使用它,而无需转换或虚拟对象。这是以特殊子类为代价的。
添加回答
举报