سؤال

أنا جاهل هنا ...

 1: private static class ForeignKeyConstraint implements Comparable<ForeignKeyConstraint> {
 2: String tableName;
 3: String fkFieldName;
 4: 
 5: public int compareTo(ForeignKeyConstraint o) {
 6:    if (this.tableName.compareTo(o.tableName) == 0) {
 7:            return this.fkFieldName.compareTo(o.fkFieldName);
 8:        }
 9:        return this.tableName.compareTo(o.tableName);
10:    }
11: }

في السطر 6 أحصل من FindBugs: Bug: net.blabla.SqlFixer$ForeignKeyConstraint defines compareTo(SqlFixer$ForeignKeyConstraint) and uses Object.equals()

رابط إلى التعريف

لا أعرف كيفية تصحيح هذا.

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

المحلول

هذه الأخطاء تعني أنك لا تتجاوز equals في ForeignKeyConstraint (وبالتالي وراثة equals من عند Object) لذا فإن ما يلي غير صحيح (من جافادوك compareTo):

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

لإصلاح فحص FindBugs ، تجاوز equals - و hashCode - إذا كان الأمر منطقيًا بشكل عام (أو استبعاد التحقق من هذه الفئة والوثيقة التي ينتهكها فصلك هذا الشرط باستخدام الملاحظة المقترحة).

نصائح أخرى

يمكنك حلها عن طريق تنفيذ طريقة متساوية (). الرجوع إلى تعريف FindBugs:

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

"ينصح بشدة ، ولكن ليس مطلوبًا بشكل صارم (x.compareto (y) == 0) == (x.equals (y))."

مثال آخر هو Treeset. إنه ينفذ فحص المساواة عن طريق استدعاء المقارنة ، وتنفيذ المقارنة الذي لا يتماشى مع متساوٍ يجعل Treeset تنتهك عقد الواجهة المحددة ، مما قد يؤدي إلى خلل في البرنامج.

إنه يخبرك أن هناك احتمالًا للمقارنة () ومتساوي () أن يختلف. ويجب عليهم ، حقًا ، لا يوافقون أبدًا.

يتم توريث طريقة متساوية () من java.lang.object ، والتي تفتيح افتراضيًا لمعرفة ما إذا كان كائنين متماثلين نموذج. تتمثل طريقة المقارنة الخاصة بك في مقارنة الكائنات على Tablename و FkFieldName. لذلك ، من المحتمل أن تجد نفسك في موقف ينص فيه المقارنة على أن كائنين متماثلان (لأن مطابقة Tablename و FkfieldName) ، ولكنها تساوي الدول أنها مختلفة (لأنها مثيلات مختلفة).

هناك عدد قليل من واجهات برمجة التطبيقات Java التي تعتمد على المقارنة والمتساوية كونها متسقة ؛ هذا جزء من لغة Java ويعتبر عقدًا أساسيًا أساسيًا. من الناحية المثالية ، قم بتنفيذ طريقة متساوية (و hashcode) للتحقق من المساواة استنادًا إلى Tablename و FKFieldName.

هل حاولت تجاوز طريقة متساوين أيضًا في sqlfixer.foreigneyConstraint؟

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

لمزيد من المعلومات تحقق من جافا جوشوا بلوش الفعالة ، الطبعة الثانية. البند 12 يمر بشكل أكثر عمقًا حول خصوصيات وعموميات تنفيذ قابلة للمقارنة وبعض الأشياء التي يجب البحث عنها.

FindBugs سعيد بـ:

public int compareTo(ForeignKeyConstraint o) {
    if (this.equals(o)) {
        return 0;
    } else if (this.tableName.equals(o.tableName)) {
        // fkFieldName must be different
        return this.fkFieldName.compareTo(o.fkFieldName);
    } else {
        // tableName must be different
        return this.tableName.compareTo(o.tableName);
    }
}

@Override
public equals() {
  ...
}

@Override
public int hashCode() {
  ...
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top