1 回答

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