1 回答

TA貢獻1848條經(jīng)驗 獲得超6個贊
因為您必須捕獲或拋出,Exception
并且必須確保不在塊之后AutoCloseable.close()
執(zhí)行任何操作,因為它沒有超出范圍,就像直接實現(xiàn)一樣。我仍然同意其他人的觀點,即這個解決方法非常好。context
try
InitialDirContext
AutoCloseable
當然,您也可以擴展InitialDirContext
并使其AutoCloseable
直接實現(xiàn),或者(對于最終類)使用委托者模式并包裝目標對象。
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
都是以塊內(nèi)的對象variant2
為代價的,除非您首先將它們投射到塊內(nèi),否則您將永遠不會使用它們。當然,您可以直接使用外部對象,這也是您所建議的。dummy
try
InitialDirContext
context
在
variant3
自動關閉context
對象中直接具有正確的(子)類型,因此您實際上可以無縫地使用它,而無需轉換或虛擬對象。這是以特殊子類為代價的。
添加回答
舉報