سؤال

النظر في هذا الخط:

if (object.getAttribute("someAttr").equals("true")) { // ....

من الواضح أن هذا الخط هو علة محتملة، قد تكون السمة null وسوف نحصل على NullPointerException. وبعد لذلك نحن بحاجة إلى إعادة تعدادها إلى واحد من اختيارات:

الخيار الأول:

if ("true".equals(object.getAttribute("someAttr"))) { // ....

الخيار الثاني:

String attr = object.getAttribute("someAttr");
if (attr != null) {
    if (attr.equals("true")) { // ....

الخيار الأول محرج لقراءة ولكن أكثر إيجازا، في حين أن المرء الثاني واضح في النية، ولكن مطالبة.

ما الخيار الذي تفضله من حيث القراءة؟

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

المحلول

لقد استخدمت دائما

if ("true".equals(object.getAttribute("someAttr"))) { // ....

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

نصائح أخرى

في الخيار الثاني، يمكنك الاستفادة من الدائرة القصيرة &&:

String attr = object.getAttribute("someAttr");
if (attr != null && attr.equals("true")) { // ....

هناك حالات معينة حيث يشعر النهج الموجز بالخطأ في البدء بل يصبح اصطلاحي. هذا هو واحد منهم؛ الآخر هو شيء مثل:

String line;
while ((line = bufferedReader.readLine()) != null) {
  // Use line
}

آثار جانبية في حالة؟ لا يمكن تصوره! باستثناء أنه أجمل بشكل أساسي من البدائل، عندما تتعرف على النمط الخاص.

هذا النمط مشابه - إنه شائع جدا في جافا الذي أتوقعه أي مطور من ذوي الخبرة المعقولة للتعرف عليه. والنتيجة موجزة سارة. (مسليا، أرى أحيانا رمز C # الذي يستخدم نفس المصطلح، دون داع - مشغل المساواة يعمل بشكل جيد مع السلاسل في C #.)

خلاصة أسفل: استخدم الإصدار الأول، وتعرف على ذلك.

أحب الخيار 1 وأود أن يجادل بأنه قابل للقراءة بما فيه الكفاية.

سيكون Option 3 BTW تقديم طريقة GetAttribute التي تأخذ قيمة افتراضية كمعلمة.

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

Util.isEmpty(string) - عائدات string == null || string.trim().isEmpty() Util.notNull(string) إرجاع "" إذا string == null, ، سلسلة خلاف ذلك.Util.isNotEmpty(string) عائدات ! Util.isEmpty(string)

ولدينا اتفاقية للأسلحة، Util.isEmpty(string) يعني semantically صحيح و Util.isNotEmpty(string) يعني دلالة خطأ.

إنه سؤال جيد للغاية. عادة ما أستخدم غير رشيقة:

if (object.getAttribute("someAttr") != null && object.getAttribute("someAttr").equals("true")) { // ....

(ولن أستخدمها بعد الآن)

لدي إجابة أخرى؛

List<Map<String, Object>> group = jjDatabase.separateRow(db.Select("SELECT * FROM access_user_group  WHERE user_id=1 ;"));

لا يوجد "group_c80" كعمود في "access_user_group" في قاعدة البيانات الخاصة بي، لذلك في الحصول على (0) .get ("group_c80") يتوافق استثناء مؤشر NULL. لكنني تعاملت مع الرمز أدناه:

for (int j = 1; j < 100; j++) {
                    String rulId="0";//defult value,to privent null pointer exeption in group_c
                    try {
                        rulId = group.get(0).get("group_c" + j)).toString();
                    } catch (Exception ex) {
                        ServerLog.Print( "Handeled error in database for " + "group_c" + (j < 10 ? "0" + j : j) +"This error handeled and mot efect in program");
                        rulId = "0";
                    }}

هنا هو نهجي، يحتاج إلى PropertyUtil فئة رغم ذلك، لكنها مكتوبة فقط مرة واحدة:

/**
 * Generic method to encapsulate type casting and preventing nullPointers.
 * 
 * @param <T>          The Type expected from the result value.
 * @param o            The object to cast.
 * @param typedDefault The default value, should be of Type T.
 * 
 * @return Type casted o, of default.
 */
public static <T> T getOrDefault (Object o, T typedDefault) {
    if (null == o) {
        return typedDefault;
    }
    return (T) o;
}

رمز العميل يمكن أن يفعل هذا:

PropertyUtil.getOrDefault(obj.getAttribute("someAttr"), "").equals("true");

أو للحصول على قائمة:

PropertyUtil.getOrDefault(
    genericObjectMap.get(MY_LIST_KEY), Collections.EMPTY_LIST
).contains(element);

أو إلى قائمة الاستهلاكية، من شأنها رفض الكائن:

consumeOnlyList(
    PropertyUtil.getOrDefault(
        enericObjectMap.get(MY_LIST_KEY), Collections.EMPTY_LIST
    )
)

الافتراضي قد يكون نظام كائن فارغ https://en.wikipedia.org/wiki/null_object_pattern.

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