سؤال

في لغة C++، نحصل على مورد في مُنشئ ونحرره في مُدمر.

لذا، عندما يظهر استثناء في منتصف إحدى الوظائف، لن يكون هناك تسرب للموارد أو كائنات مزامنة مقفلة أو أي شيء آخر.

لا تحتوي فئات AFAIK Java على أدوات تدمير.فكيف يمكن للمرء أن يفعل إدارة الموارد في جافا.

على سبيل المثال:

public int foo() {    
    Resource f = new Resource();
    DoSomething(f);
    f.Release();
}

كيف يمكن للمرء تحرير المورد إذا ألقى DoSomething استثناءً؟لا يمكننا وضع كتل Try\catch في جميع أنحاء الكود، أليس كذلك؟

هل كانت مفيدة؟

المحلول

نعم، يمكنك ويجب عليك وضع محاولة/التقاط/حظر أخيرًا حول الكود الخاص بك.يوجد في C# عبارة مختصرة "باستخدام"، ولكن في Java أنت عالق مع:

public int foo() {
    Resource f = new Resource();
    try {
        DoSomething(f);
    }
    finally {
        f.Release();
    }
}

نصائح أخرى

يعود تاريخ هذا السؤال إلى عام 2008 وبالتالي يتعلق بـ Java 6.منذ ذلك الحين تم إصدار Java 7، والذي يحتوي على ميزة جديدة لإدارة الموارد التلقائية.للحصول على سؤال أحدث يتعلق بـ Java 7، راجع هذا السؤال:

تقنيات جافا لإصدار الموارد التلقائي؟"التنظيف الفوري"؟

من الممكن استبعاد المحاولة/أخيرًا (والاستثناءات والخوارزميات) باستخدام لغة التنفيذ حول.ومع ذلك فإن بناء الجملة مطول للغاية.

public int foo() {
    withResource(new WithResource() { public void run(Resource resource) {
        doSomething(resource);
    }});
}

...

public interface WithResource {
    void run(Resource resource);
}

public static void withResource(WithResource handler) {
    Resource resource = new Resource();
    try {
        handler.run(resource);
    } finally {
        resource.release();
    }
}

يكون هذا النوع من الأشياء أكثر منطقية إذا كنت تلخص أكثر من المحاولة/أخيرًا.على سبيل المثال، باستخدام JDBC، يمكنك تنفيذ عبارة، وتكرار النتائج، وإغلاق الموارد، والتفاف الاستثناء.

إذا كنت تريد المشاركة في كتلة الاستخدام في مناقشة إغلاق جافا:S

آسف لإحباطك ولكن في جافا نحن يفعل استخدم Try\catch\أخيرًا يحظر الكثير.وأعني بـ "الكثير". كثيراً.أتمنى أحيانًا أن يكون لدى Java كتلة استخدام C#.لن تحتاج في أغلب الأحيان إلى تحرير الموارد لأن أداة تجميع البيانات المهملة في Java ستتولى ذلك.

ومع ذلك، فإن الاستثناءات لها استخداماتها في جعل معالجة الأخطاء أكثر نظافة.يمكنك كتابة الاستثناءات الخاصة بك والتقاطها لأي شيء تفعله.لا مزيد من إرجاع رموز الخطأ التعسفية للمستخدم!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top