عامة جافا إطار لإدارة ثنائي الاتجاه الجمعيات معكوس التحديثات

StackOverflow https://stackoverflow.com/questions/169420

سؤال

لقد كنت أبحث عن عام طريقة للتعامل مع ثنائي الاتجاه الجمعيات و طريقة التعامل مع معكوس التحديثات في دليل كتابة كود جافا.

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

public class A {
    public B getB();
    public void setB(B b);
}

public class B {
    public List<A> getAs();
}

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

a.setB(b);
b.getA().add(a);

أو عن طريق وضع رمز مطابقة في واضع / جالبة استخدام قائمة مخصصة التنفيذ.

لقد وجدت عفا عليها الزمن, غير المشرف عليها المشروع الذي تبعيات لم تعد متوفرة (https://e-nspire-gemini.dev.java.net/).انها تتعامل مع المشكلة من خلال استخدام الشروح التي تستخدم لحقن البرمجية الضرورية تلقائيا.

لا أحد يعرف من إطار آخر أن يتعامل مع هذا في عام, غير مزعجة طريقة علاء الجوزاء ؟

إلى اللقاء إلمار

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

المحلول

ومجموعات جوجل (من قانون الداخلي غوغل) - http://code.google. كوم / ف / جوجل-مجموعات / عبارة جافا الوراثة متوافقة (وليس فقط متوافقة، يستخدم الأدوية بشكل جيد جدا)

والدرجة BiMap - <وأ href = "http://google-collections.googlecode.com/svn/trunk/javadoc/index.html؟http://google-collections.googlecode.com/svn/trunk/ جافادوك / كوم / جوجل / مشترك / جمع / حزمة summary.html "يختلط =" نوفولو noreferrer "> http://google-collections.googlecode.com/svn/trunk/javadoc/index.html؟http://google -collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/package-summary.html يسمح للجمعيات ثنائية الاتجاه.

ومن المتوقع أن تشق طريقها إلى JDK 7 بعض من هذه الفئات.

نصائح أخرى

إلا إذا كنت مجردة من واضعي ، كنت تنوي أن توفر نوعا من الحدث آلية الإخطار.إذا كانت الكائنات JavaBeans, ثم كنت تبحث في استخدام PropertyChangeSupport و إطلاق خاصية تغيير الأحداث.

إذا كنت تفعل ذلك (أو آلية أخرى للكشف عن التغييرات) ، ثم المزجج قوائم يوفر ObservableElementList التي يمكن بسهولة أن تستخدم للتعامل مع جمعية التزامن من قائمة الغاية (أيإضافة إلى قائمة< A> تلقائيا المكالمات.setB(ب)).الاتجاه الآخر هو التعامل معها بسهولة باستخدام خاصية تغيير رصد (أو ما يعادلها).

أنا أدرك أن هذا ليس حل العامة ، ولكن يبدو أن الأمر سيكون سهلا مؤسسة واحدة.

علما أن شيئا مثل هذا من شأنه أن تتطلب قائمة خاصة التنفيذ في الفئة ب - مستحيل قصيرة اوب نوع الحلول التي يمكن التعامل معها في الحالة العامة (أيباستخدام ArrayList أو شيء من هذا القبيل).

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

إذا كنت تصميم هذا ، سوف ننظر بشيء من هذا القبيل:

AssociationBuilder.createAssociation(A a, Connector< A> ca, B b,  Connector< B> cb, Synchronizer< A,B> sync)

موصل واجهة التي تسمح واجهة واحدة لمختلف تغيير أنواع الإعلام.التزامن هو واجهة يسمى للتأكد من كل الكائنات هي في تزامن كلما واحد منهم تغيير.

sync(ChangeInfo info, A a, B b) // make sure that b reflects current state of a and vice-versa.  

ChangeInfo توفر البيانات التي الأعضاء تغيرت و ما التغييرات في الواقع.نحن.إذا كنت تحاول أن تبقي حقا هذا عام ، ثم لديك إلى حد كبير بونت تنفيذ هذا الإطار المستخدم.

مع ما سبق في المكان ، كان من الممكن أن يكون هناك عدد محدد مسبقا موصلات المزامنات التي تلبي مختلف معايير ملزمة.

ومن المثير للاهتمام أن الأسلوب أعلاه التوقيع هو شبيه JSR 295 createAutoBinding() استدعاء الأسلوب.الكائنات الملكية هي ما يعادل الموصل.JSR 295 لا يكون مزامن (بدلا من ذلك ، لديهم ملزمة استراتيجية محددة مثل التعداد - بالإضافة إلى JSR 295 يعمل فقط مع الملكية->المنشأة ملزمة ، في محاولة لربط قيمة حقل كائن واحد إلى هذا الكائن قائمة العضوية في كائن آخر ليس حتى على الطاولة بالنسبة لهم).

لمعنى، وهذه calsses يكون أقرانهم. أقترح آلية لحزمة خاصة (في absense من صديق) للحفاظ على الاتساق.

public final class A {
    private B b;
    public B getB() {
        return b;
    }
    public void setB(final B b) {
        if (b == this.b) {
            // Important!!
            return;
        }
        // Be a member of both Bs (hence check in getAs).
        if (b != null) {
            b.addA(this);
        }
        // Atomic commit to change.
        this.b = b;
        // Remove from old B.
        if (this.b != null) {
            this.b.removeA(this);
        }
    }
}

public final class B {
    private final List<A> as;
    /* pp */ void addA(A a) {
        if (a == null) {
            throw new NullPointerException();
        }
        // LinkedHashSet may be better under more demanding usage patterns.
        if (!as.contains(a)) {
            as.add(a);
        }
    }
    /* pp */ void removeA(A a) {
        if (a == null) {
            throw new NullPointerException();
        }
        as.removeA(a);
    }
    public List<A> getAs() {
        // Copy only those that really are associated with us.
        List<A> copy = new ArrayList<A>(as.size());
        for (A a : as) {
            if (a.getB() == this) {
                copy.add(a);
            }
        }
        return Collection.unmodifiableList(copy);
    }
}

و(Disclaime: لم يتم اختباره أو حتى المترجمة)

ومعظمهم استثناء آمن (قد تسرب في حالة استثناء). سلامة الموضوع، وكثير كثير، والأداء، libraryisation، وما إلى ذلك، ويترك باعتبارها ممارسة للقارئ المهتمين.

وشكرا لجميع الاقتراحات. ولكن لا شيء جاءت قريبة من ما كنت أبحث عنه، وأنا ربما صياغة السؤال بطريقة خاطئة.

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

وعندما نظرت حولها أكثر من ذلك بقليل وجدت مجموعة من الجوزاء في CNET التي تحتوي على جميع المصادر وتبعيات مع المصادر. وكانت مصادر في عداد المفقودين لتبعيات القلق الوحيد الذي يمنعني من استخدامه. منذ الآن جميع المصادر المتاحة البق يمكن أن تكون ثابتة. في حالة أي شخص بالبحث عن هذا: http://www.download.com/Gemini /3000-2413_4-10440077.html

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