سؤال

أنا مبرمج مبتدئ جافا وأقرأ متغيرا من فئة عدد صحيح يمكن وصفه ثلاث طرق مختلفة في API. لدي الكود التالي:

if (count.compareTo(0)) { 
            System.out.println(out_table);
            count++;
    }

هذا داخل حلقة ونواتج فقط out_table.
هدفي هو معرفة كيفية معرفة ما إذا كانت القيمة في عدد صحيح count > 0.

أنا أدرك ذلك count.compare(0) هل الطريقة الصحيحة؟ أو هو count.equals(0)?

أنا أعرف ال count == 0 غير صحيح. هل هذا صحيح؟ هل هناك مشغل مقارنة القيمة حيث لها فقط count=0?

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

المحلول

الأعداد الصحيحة AutoNBoxed، لذلك يمكنك فقط القيام به

if (count > 0) {
    .... 
}

نصائح أخرى

لمعرفة ما إذا كان Integer أكبر من 0، يمكنك:

  • تحقق فيما لو compareTo(O) إرجاع رقم موجب:

    if (count.compareTo(0) > 0)
         ...
    

    ولكن هذا يبدو سخيفا جدا، أليس كذلك؟ أفضل فقط ...

  • استعمال الاسترجة1:

    if (count > 0)
        ....
    

    هذا يعادل:

    if (count.intValue() > 0)
        ...
    

    من المهم أن نلاحظ ذلك "==يتم تقييمه مثل هذا، مع Integer معامل Unboxed بدلا من int المعامل محاصر. غير ذلك، count == 0 سوف يعود خطأ عندما count تمت تهيئة as. new Integer(0) (لأن "=="اختبارات المساواة المرجعية).

1من الناحية الفنية، يستخدم المثال الأول الاسترجة (قبل Java 1.5 لا يمكنك تمرير int ل compareTo) ويستخدم المثال الثاني الإخراج من العلبة. وبعد غالبا ما تسمى الميزة المشتركة ببساطة "Autoboxing" لفترة قصيرة، والتي غالبا ما تم توسيعها في استدعاء كلا النوعين من التحويلات "Autoboxing". أعتذر عن استخدام LAX الخاص بي للمصطلحات.

من الأفضل تجنب الاستمتاع غير الضروري لأسباب.

لشيء واحد، إنه أبطأ بعض الشيء من int < int, ، كما كنت (في بعض الأحيان) إنشاء كائن إضافي؛

void doSomethingWith(Integer integerObject){ ...
  int i = 1000;
  doSomethingWith(i);//gets compiled into doSomethingWith(Integer.valueOf(i));

القضية الأكبر هي أن الاستمتاع المخفي يمكن أن تخفي الاستثناءات:

void doSomethingWith (Integer count){
  if (count>0)  // gets compiled into count.intValue()>0

استدعاء هذه الطريقة مع null سوف رمي أ NullPointerException.

تم وصف الانقسام بين الأعمليين والأجسام المجمع في جافا على أنه kludge للسرعة. الاستهلاابي يخفي تقريبا هذا، ولكن ليس تماما - منظف فقط لتتبع النوع. لذلك إذا كان لديك كائن صحيح، يمكنك فقط الاتصال compare() أو intValue(), ، وإذا كنت قد حصلت على البدائية فقط تحقق من القيمة مباشرة.

يمكنك أيضا استخدام المساواة:

 Integer a = 0;

 if (a.equals(0)) {
     // a == 0
 }

وهو ما يعادل:

 if (a.intValue() == 0) {
     // a == 0
 }

و أيضا:

 if (a == 0) {

 }

(توفر مترجم Java تلقائيا intvalue.())

لاحظ أن التمهيدي / AutoNBoxing يمكن أن يعرض علامة نفقية كبيرة (خاصة الموجودة داخل الحلقات).

على الرغم من أنه يمكنك بالتأكيد استخدام compareTo الطريقة على مثيل عدد صحيح، ليس من الواضح عند قراءة التعليمات البرمجية، لذلك يجب عليك تجنب القيام بذلك.

يتيح لك Java استخدام الاستروبوكسينج (انظر http://java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html.) للمقارنة مباشرة مع int، حتى تتمكن من القيام:

if (count > 0) { }

و ال Integer نموذج count يحصل تحويل تلقائيا إلى int للمقارنة.

إذا كنت تواجه مشكلة في فهم هذا، تحقق من الرابط أعلاه، أو تخيل أنه يقوم بذلك:

if (count.intValue() > 0) { }

شيء آخر يراقبه هو إذا كانت القيمة الثانية كانت كائن عدد صحيح آخر بدلا من "0" حرفي، يقوم المشغل "==" بتقارير مؤشرات الكائنات ولن يقوم Unbox Auto-Unbox.

بمعنى آخر:

Integer a = new Integer(0);   
Integer b = new Integer(0);   
int c = 0;

boolean isSame_EqOperator = (a==b); //false!
boolean isSame_EqMethod = (a.equals(b)); //true
boolean isSame_EqAutoUnbox = ((a==c) && (a.equals(c)); //also true, because of auto-unbox

//Note: for initializing a and b, the Integer constructor 
// is called explicitly to avoid integer object caching 
// for the purpose of the example.
// Calling it explicitly ensures each integer is created 
// as a separate object as intended.
// Edited in response to comment by @nolith

حسنا، قد أتأخر عن ذلك، لكني أرغب في مشاركة شيء ما:

بالنظر إلى الإدخال: system.out.println (Isgreaterthanzero (-1))؛

public static boolean isGreaterThanZero(Integer value) {
    return value == null?false:value.compareTo(0) > 0;
}

عائدات خاطئة

public static boolean isGreaterThanZero(Integer value) {
    return value == null?false:value.intValue() > 0;
}

إرجاع حقيقي حتى أفكر في "مقارنة" الخاص بك سيكون أكثر دقة.

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