2009-03-26 11 views
5

W języku C++ mamy wzór (RAII), który znacznie upraszcza zarządzanie zasobami. Chodzi o to, aby zapewnić jakiś obiekt do owijania dla dowolnego rodzaju zasobów. Destruktor obiektu opakowującego jest następnie odpowiedzialny za zwalnianie zasobów, gdy wykracza poza jego zakres. Na przykład:Czy zarządzanie zasobami C++ jest możliwe w Javie

{ 
    auto_ptr<int> smartPointer = new int; 
    // some other code 

} // the memory allocated for the int is released automatically 
    // by smartPointer's destructor 

Najczęstszym zastosowaniem są inteligentne wskaźniki. Ale istnieje wiele innych rodzajów zasobów (pliki, muteksy, gniazda itp.), Którymi można zarządzać w dokładnie taki sam sposób.

W Javie nie trzeba martwić się zarządzaniem pamięcią. Ale wszystkie inne rodzaje zasobów pozostają. Istnieje blok w końcu, ale jego użycie jest dość niewygodne, zwłaszcza gdy można wygenerować wiele różnych wyjątków.

Moje pytanie brzmi, czy istnieje wzór Java, który zapewnia funkcjonalność równoważną C++ RAII? Jeśli nie, podziel się swoimi najlepszymi praktykami w tej dziedzinie (zamiast w końcu, jeśli nie jest to używane w wyrafinowany sposób).

+0

Zobacz to pytanie: http://stackoverflow.com/questions/194261/raii-in-java-is-resource-disposal-always-so-ugly-was-i-had-a-dream – Eclipse

+0

Również: http : //stackoverflow.com/questions/477399/does-java-support-raii-deterministic-destruction – Eclipse

+0

"co niezwykle upraszcza zarządzanie zasobami" - czy ty mnie żartujesz? – hasen

Odpowiedz

10

Można użyć zwykłej acquire; try { use; } finally { release; }. Alternatywnie można obliczyć obsługę zasobów za pomocą Execute Around idiom.

4

Joshua Bloch zaproponowała dodanie mechanizm zwany Automatic Resource Management Java jako część projektu Coin (niewielkie zmiany językowe dla JDK 7):

+0

To jest po prostu (użyteczny) cukier syntaktyczny dla try/catch/finally. Więc jeśli chcesz zrobić coś dzisiaj (w przeciwieństwie do 2011), zobacz odpowiedzi na temat try/catch/finally. –

+2

Tyle tylko, że try/finally sucks w porównaniu do RAII. Pierwotne pytanie brzmiało, czy Java ma coś porównywalnego z RAII, a odpowiedź brzmi: najwyraźniej nie. –

1

wielu koderów, siła idiomu RAII jest to, że życie instrumentu bazowego zasób jest powiązany z blokiem zasięgu, co ułatwia tworzenie i utrzymywanie rzeczy; ostatecznie redukuje błędy wynikające z braku możliwości zwolnienia tego zasobu.

Niestety nie można naśladować tego zachowania w Javie, ponieważ nie można tworzyć własnych struktur związanych z zasięgiem. Język podobny do Javy, który próbował rozwiązać ten problem, jest C#:

// explicit release 
MyClass obj = MyClass(); 
obj.UseIt(); 
obj.Dispose(); 

// RAII-like (scope-bound) release 
using(MyClass obj = new MyClass()) 
{ 
    obj.UseIt(); 
} 

Być może wkrótce zobaczymy taką funkcjonalność.

+0

Python dodał to również z 'with' konstruktorem – hasen

+0

To nie prawda. Możesz z pewnością symulować go w Javie, jak sugeruje Tom Hawtin - tackline. – kirakun

+0

@Kirakun: symuluj "to"; zakres? Moje czoło właśnie urosło o cal. –

Powiązane problemy