سؤال

أنا باستخدام واجهة تسمى المسند الذي يستخدم في غربلة من خلال مجموعات.على سبيل المثال, لا يمكن أن تحدد

public class BlackCatPredicate implements Predicate<Cat> {
  public boolean evaluate( Cat c ) {
       return c.isBlack();
  }
}

ثم استخدام بعض المساعدة findAll( Collection<T> coll, Predicate<T> pred) طريقة تطبيق المسند إلى مجموعة من القطط فقط تلك السوداء ، إلخ.

سؤالي هو:انا العثور على القطط السوداء في جميع أنحاء قانون بلدي ، لذلك ليس هناك حاجة للحفاظ على إنشاء مجلس BlackCatPredicate مرارا وتكرارا.ينبغي أن يكون مجرد حالة واحدة.(المفرد?) ولكن بعد ذلك, خلال كتابة العديد من المسندات ، أنا لا أريد أن يكون لتنفيذ كل واحد المفرد.لذا ما هو التصميم المناسب هنا ؟

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

المحلول

كنت استخدم مجهول الدرجة المستمر ووضعها مع الطبقة تعمل على:

public class Cat{
    public static final Predicate<Cat> BLACK_PREDICATE = new Predicate<Cat>(){
            public boolean evaluate( Cat c ) {
                return c.isBlack();
            }
        };

    // Rest of the Cat class goes here
}

إذا كان المسند وقد المعلمات يمكنك استخدام طريقة مصنع ثابت.

تحرير: كما ذكر في التعليقات ، اعتمادا على أنماط الاستخدام ، فإنه قد يؤدي أوضح رمز على جمع المسند الثوابت (و/أو أساليب المصنع) في فئة منفصلة ، إما ليس فقط القط, أو كل منهم.ذلك يعتمد أساسا على عدد كم إضافية المنظمة مفيد.

نصائح أخرى

وشيء من هذا القبيل يجب أن تعمل:

class Predicates
{
    private static class BlackCatPredicate implements Predicate<Cat> 
    {
        public boolean evaluate(final Cat c) 
        {
            return c.isBlack();
        }
    }

    private static final BlackCatPredicate = new BlackCatPredicate(); 


    public static Predicate<Cat> getBlackCatPredicate()
    {
        return (blackCatPredicate);
    }
}

هل يمكن أن تجعل مصنع عام أن يأخذ أي المسند كنوع من ARG - ومن ثم يقوم بإنشاء مثيل واحد لنوع معين المسند

ونهج أعم آخر سيكون للبدء في استخدام مكتبة حقن التبعية - وبذل كل ما خلق وجوه الخاص بك من خلال ذلك. عادة يمكنك التبديل نوع أن يكون المفرد، إذا كان ذلك مناسبا، مع تغيير طفيف.

وأود أن لا تقلق حول إنشاء الحالات BlackCatPredicate إضافية على الإطلاق.

إذا كنت لا تحب كتابة new BlackCatPredicate() في كل مكان أنت بالتأكيد يمكن إضافة أسلوب مصنع ثابت حتى تتمكن من كتابة BlackCatPredicate.getInstance() بدلا من ذلك. بعد خيار آخر يتمثل في إنشاء فئة منفصلة حتى تتمكن من كتابة CatPredicates.getBlackCatPredicateInstance().

ولكن هذا فقط لاستخلاص إنشاء المسند من رمز العميل، فإنه لا علاقة له مع إنشاء الكائن الفعلي لا شيء. التعامل مع الأشياء قصيرة الأجل هي واحدة من الأشياء JVM يفعل أفضل، لذلك سوف يخلق مجموعة من الحالات BlackCatPredicate إضافية والتخلص منها على الفور لا تؤثر على أدائك في أدنى.

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