Birden çok Closeable
kaynağını yöneten bir Java sınıfı oluşturmaya çalışıyorum.Java'da kapatılabilir nesneler nasıl oluşturulur?
class composed_resource
{
resource_a a;
resource_b b;
resource_c c;
composed_resource(int x)
: a(x), b(x), c(x)
{ }
~composed_resource()
{ }
};
:
public class ComposedResource implements Closeable
{
private final ResourceA a;
private final ResourceB b;
private final ResourceC c;
public ComposedResource(int x) /* throws ... */ {
a = new ResourceA(x);
try {
b = new ResourceB(x);
try {
c = new ResourceC(x);
} catch (Throwable t) {
b.close();
throw t;
}
} catch (Throwable t) {
a.close();
throw t;
}
}
@Override
public void close() throws IOException {
try {
a.close();
} finally {
try {
b.close();
} finally {
c.close();
}
}
}
}
Biraz geliştirilmiş versiyonu:
public class ComposedResource2 implements Closeable
{
private final ResourceA a;
private final ResourceB b;
private final ResourceC c;
public ComposedResource2(int x) /* throws ... */ {
try {
a = new ResourceA(x);
b = new ResourceB(x);
c = new ResourceC(x);
} catch (Throwable t) {
close();
throw t;
}
}
@Override
public void close() throws IOException {
try {
if (a != null) a.close();
} finally {
try {
if (b != null) b.close();
} finally {
if (c != null) c.close();
}
}
}
}
orada mı C++ çözüm basit ve kaynakların daha büyük bir sayı ile kolayca ölçeklenebilir olurdu hala istisna güvenliği korurken, yuvalanmış try-catch-blokları önleyen daha zarif çözüm? Üç kaynakla yönetilebilir, ama daha fazlası bir şey işe yaramıyor. (Yerel bir kapsam olsaydı, ben sadece bir "denemek-ile-kaynaklar" deyimi kullanabilirsiniz, ama bu burada geçerli değildir.)
java.rmi
ile çalışırken ben bu konuda düşünce
. Kurucuda, kayıt oluşturup/ararken, nesneleri ararken ve nesnelere ihracat yapıyorum. Close() öğelerinin kaydını kaldırması ve geri göndermesi gerekir. Ben ihracat/unexport işlemek için sarıcı nesneleri oluşturmayı düşündüm (RAI'dan yararlanmak için C++'da yaptığım gibi), ama sonra bana çok fazla yardımcı olmayacağını fark ettim (bir Java uzmanı değilim, ama bunu üniversite için kullanmalıyım).
Şu anda ComposedResource2
gibi bir şey kullanıyorum ve iyi çalışıyor. Ama şimdi daha zarif bir çözüm olup olmadığını bilmek istiyorum.
Kullanım örneği sunabilir misiniz? Belki de somut bir örnekle çalışmak, soyut bir problemden daha iyi bir cevap üretecektir ... –
Neden kaynak ile denenmesi uygun değil? –
1) Kurucularda kaynak yaratmamaktan kaçının - ideal olarak, alanlara parametreler atamaları ve RAII'in burada geçerli olmadığını düşünüyorum. 2) Mümkünse kaynakları deneyin (eğer kurucunuz sadece “atama modunda” çalışacaksa sizin için daha uygun olacaktır). 3) Birden fazla 'Kapatılabilir 'örneğini tek bir örnekte birleştiren' Kapatılabilir' dekoratörünüzü yazabilirsiniz. 4) Ya da Guava 'com.google.common.io'yu kullanabilirsiniz.Closer'. –