اذهب إلى المحتوى

السؤال

نشر

لذلك ، في Java ، يجب أن يكون السطر الأول من المُنشئ الخاص بك بمثابة استدعاء لـ super ... سواء كان استدعاء super () ضمنيًا ، أو استدعاء بناء آخر صراحةً. ما أريد معرفته هو ، لماذا لا يمكنني وضع كتلة محاولة حول ذلك؟

حالتي الخاصة هي أن لدي فصلًا تجريبيًا للاختبار. لا يوجد بناء افتراضي ، لكني أريد أن أجعل قراءة الاختبارات أبسط. أريد أيضًا أن ألّف الاستثناءات التي تم إلقاؤها من البناء في RuntimeException.

لذا ، ما أريد فعله هو هذا بشكل فعال:

public class MyClassMock extends MyClass {
    public MyClassMock() {
        try {
            super(0);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}

لكن جافا تشكو من أن super ليس البيان الأول.

الحل الخاص بي:

public class MyClassMock extends MyClass {
    public static MyClassMock construct() {
        try {
            return new MyClassMock();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public MyClassMock() throws Exception {
        super(0);
    }

}

هل هذا هو أفضل حل؟ لماذا لا تسمح لي Java بعمل السابق؟

Recommended Posts

  • -3
نشر (معدل)

سؤالك مثير للاهتمام، اسمحوا لي أن أبدأ بمثال فشل في بناء الكائن.

class A {
   private String a = "A";

   public A() throws Exception {
        throw new Exception();
   }
}

الآن ، لنفترض أننا نود إنشاء كائن من النوع A في كتلة try ... catch.

A a = null;
try{
  a = new A();
}catch(Exception e) {
  //...
}
System.out.println(a);

من الواضح أن ناتج هذا سيكون: null. لماذا لا تقوم Java بإرجاع كائن من A؟ بعد كل شيء ، عند نقطة فشل البناء، تم بالفعل تهيئة حقل اسم الكائن ، أليس كذلك؟ حسنًا ، لا يمكن لـ Java إرجاع كائن من A لأنه لم يتم إنشاء الكائن بنجاح. الكائن في حالة غير مستقرة، وبالتالي يتم تجاهله بواسطة Java. لم تتم تهيئة المتغير A الخاص بك ، بل يتم الاحتفاظ به على أنه فارغ. الآن ، كما تعلم ، لبناء كائن جديد بالكامل ، يجب تهيئة جميع فئاته أولاً. إذا فشلت إحدى الفئات في التنفيذ ، فما هي الحالة النهائية للكائن؟ من المستحيل تحديد ذلك.

انظر إلى هذا المثال الأكثر تفصيلاً

class A {
   private final int a;
   public A() throws Exception { 
      a = 10;
   }
}

class B extends A {
   private final int b;
   public B() throws Exception {
       methodThatThrowsException(); 
       b = 20;
   }
}

class C extends B {
   public C() throws Exception { super(); }
}

عندما يتم استدعاء مُنشئ C ، إذا حدث استثناء أثناء تهيئة B ، فما قيمة المتغير النهائي int b؟ على هذا النحو ، لا يمكن إنشاء الكائن C ، فهو مزيف ، إنه سلة مهملات ، ولم تتم تهيئته بالكامل. بالنسبة لي ، هذا يفسر سبب كون الرمز الخاص بك غير قانوني.

تم التعديل في بواسطة Qusay Alkahlout

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...