C++ arkaplanından geldiğimde, RAII modelinin büyük bir hayranıyım. Bellek yönetimini ve kilit yönetimini diğer kullanım durumlarıyla birlikte kullanmak için yoğun bir şekilde kullandım.RAII tasarım deseninde Java
Java 1.7 ile RAII kalıbı oluşturmak için kaynakla çalış modelini kullanabileceğimi görüyorum.
RAII kullanarak örnek bir uygulama oluşturdum ve çalışıyor, ancak java'dan derleyici uyarıları görüyorum.
Örnek Uygulama
try(MyResource myVar = new MyResource(..))
{
//I am not using myVar here
}
Ben
warning: [try] auto-closeable resource node is never referenced in body of corresponding try statement
Ben uyarıyı Aşağıdaki hatalar, ben bilmiyorum deneyin blok içine değişken kullanmış gerektiğini ima olsun Gerçekten her zaman yapmaya ihtiyacım var.
Buna baktığımda, Java'nın RAII için gerçekten gerçek bir desteği olmadığını ve C++'da tam olarak RAII eşdeğeri değil, yalnızca Kaynak Yönetimi için olan özelliği kötüye kullanmış olabileceğimi varsayıyorum. soruların
Çift:
- benim anlayış doğru mu?
- Bu uyarıları dikkate almamak ne kadar risklidir?
- Bu uyarıları karıncadan nasıl duyarım?
- Bunun üstesinden gelmek için basit bir yol var mı?
4 i derleyici sorunları çözer ama tasarım gibi de ray dışına özünü alır bu
try(MyResource myVar = new Resource())
{
myvar.Initialize()
....
}
gibi daha basit bir yapıcı içine yapıcı çağrısı ve bir örnek yöntemi bölme düşünüyorum.
Yani 'Resource' inşaat ve sadece neden yan etkileri (kapat()' 'yanı sıra) anlamlı yöntemleri vardır ? Bir Java adamı olarak, bu bir antipattern gibi görünüyor. Kaynağın ne yaptığını açıklayabilir misin? –
@TomG otomatik kilit açma işlemine çok benzer. Kilit inşaatta alınır, yıkımın kilidini açar. Ama Java'da yok edicileriniz olmadığından, close() –
'u uygulayarak otomatik kapatmayı kullanıyorum hala biraz kafam karıştı. Bu kilit nasıl paylaşılıyor? Yeni bir Kaynak oluşturmak, başka bir kodun kontrol ettiği başka bir küresel değişkeni etkiler mi? –