سؤال

لقد عملت مؤخرًا على تحذيرات FindBugs حول كشف الحالة الداخلية، أي.عندما يتم إرجاع مرجع إلى مصفوفة بدلاً من إرجاع نسخة من المصفوفة.لقد قمت بإنشاء بعض القوالب لتسهيل تحويل هذا الرمز.

ما الخيار الذي قمت بإنشائه لدعم البرمجة الدفاعية وترغب في مشاركته مع جمهور SO؟

النماذج التي قمت بإنشائها حتى الآن (كأمثلة):

لإنشاء نسخة من مصفوفة للعودة من إحدى الطرق:

final ${type}[] ${result} = new ${type}[ ${array}.length ];
System.arraycopy( ${array} , 0 , ${result} , 0 , ${array}.length );

لاستنساخ كائن:

(${o}!= null?(${type})${o}.clone():null)
هل كانت مفيدة؟

المحلول

أحب أن يكون لدي تعريف يساوي () "أكثر أمانًا" كقالب:

 /**
 * Implement equals based on ${cursor}. <br />
 * See {@link #compareTo(Object) compareTo}
 * @see java.lang.Object#equals(java.lang.Object)
 */
public boolean equals(final Object anObject)
{
    boolean res = false;
    if(anObject == null) { return false; }
    if(anObject == this) { return true; }
    if(anObject.getClass() == this.getClass())
    {
        res = this.compareTo(anObject) == 0;
    }
    return res;
}

للتأكد من تجنب دائما مكافئ:تتجاوز طريقة يساوي يساوي في الطبقة الفائقة وقد لا تكون متماثلة (EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC)، أين:

تحدد هذه الفئة طريقة يساوي التي تتجاوز طريقة يساوي في فئة فائقة.تستخدم كلتا الطريقتين المتساويتين مثيلًا في تحديد ما إذا كان الكائنان متساويان أم لا.

وهذا أمر محفوف بالمخاطر، لأنه من المهم أن تكون طريقة التساوي متناظرة (وبعبارة أخرى، a.equals(b) == b.equals(a)).
لو B هو نوع فرعي من A, ، و Aتتحقق طريقة يساوي من أن الوسيطة هي instanceof A, ، وتتحقق طريقة يساوي B من أن الوسيطة هي instanceof B, فمن المحتمل جدًا أن علاقة التكافؤ المحددة بهذه الطرق ليست متماثلة.


هذا فقط لتطبيق الطبقات Comparable ويسمح بـ:

  • تنفيذ يساوي الذي هو نفسه دائما؛
  • يجب وضع جميع منطق المقارنة في مكان واحد فقط (ملف compareTo() وظيفة)؛
  • الامتثال لjavadoc Comparable#compareTo() يسأل للتأكد من ذلك (x.compareTo(y)==0) == (x.equals(y)) (موصى به بشدة، ولكن ليس مطلوبًا بشكل صارم بالرغم من ذلك).

نصائح أخرى

وليس القالب، ولكن يمكنني استخدام array.clone() بدلا من System.arraycopy(). هل هناك أي شيء خطأ في ذلك؟

وتحرير: قالب I استخدامها عند تنفيذ الديكور، وخاصة لواجهة مع العديد من الأساليب:

wrapped.${enclosing_method}(${enclosing_method_arguments})

ويولد تطبيق الأسلوب الحالي عن طريق تفويض دعوة إلى مثيل ملفوفة، وبالتالي منع الأخطاء نسخ / لصق.

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