سؤال

أود أن أشير إلى "موفر خدمة الإطار" كما جاء في الفصل 2 من فعالية جافا, التي تبدو بالضبط بالطريقة الصحيحة للتعامل مع مشكلة أواجه ، حيث كنت بحاجة إلى إنشاء واحدة من عدة فئات في وقت التشغيل ، على أساس String لتحديد أي خدمة ، Configuration وجوه (أساسا XML مقتطف):

ولكن كيف يمكنني الحصول على لمقدمي الخدمات الفردية (على سبيل المثالمجموعة من الافتراضي لمقدمي + بعض مخصص مقدمي) لتسجيل أنفسهم ؟

 interface FooAlgorithm
 {
     /* methods particular to this class of algorithms */
 }

 interface FooAlgorithmProvider
 {
     public FooAlgorithm getAlgorithm(Configuration c);
 }

 class FooAlgorithmRegistry
 {
     private FooAlgorithmRegistry() {}
     static private final Map<String, FooAlgorithmProvider> directory =
        new HashMap<String, FooAlgorithmProvider>();
     static public FooAlgorithmProvider getProvider(String name)
     {
         return directory.get(serviceName);
     }
     static public boolean registerProvider(String name, 
         FooAlgorithmProvider provider)
     {
         if (directory.containsKey(name))
            return false;
         directory.put(name, provider);
         return true;
     }
 }

على سبيل المثالإذا أنا أكتب فئات مخصصة MyFooAlgorithm و MyFooAlgorithmProvider لتنفيذ FooAlgorithm وأنا توزيعها في جرة, هل هناك أي طريقة للحصول على registerProvider أن يسمى تلقائيا ، أو موكلي البرامج التي تستخدم الخوارزمية يجب أن تدعو صراحة FooAlgorithmRegistry.registerProvider() لكل فئة يريدون استخدامها ؟

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

المحلول

أعتقد أنك تحتاج إلى إنشاء ملف META-INF/الخدمات/بالكامل.المؤهلين.ClassName و قائمة الأشياء هناك ، ولكن لا أتذكر المواصفات (جرة ملف المواصفات أو هذا).

على عملية تصميم API اعترافات جافا مهندس كتاب الفصل 8 عن SPI.

على ServiceLoader قد تساعدك المتوفرة في قائمة التطبيقات.على سبيل المثال مع PersistenceProvider واجهة:

ServiceLoader<PersistenceProvider> loader = 
        ServiceLoader.load(PersistenceProvider.class);
Iterator<PersistenceProvider> implementations = loader.iterator();
while(implementations.hasNext()) {
    PersistenceProvider implementation = implementations.next();
    logger.info("PersistenceProvider implementation: " + implementation);
}

نصائح أخرى

هل يمكن أن يكون العميل جرة سجل مقدمي الخدمات في ثابت مهيئ كتلة داخل بعض الفئة التي تعرف سوف يطلق قبل FooAlgorithmRegistry.getProvider(), شيء مثل:

static {
    FooAlgorithmRegistry.registerProvider("test", new MyFooAlgorithmProvider());
}

ولكن قد يكون من الصعب جدا العثور على وسيلة إلى ضمان تشغيل (ثابت المهيآت مضمونة تشغيل مرة واحدة ومرة واحدة فقط, عندما الدرجة الأولى تحميل) قبل accessor طريقة المصنع.

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