سؤال

كنت أقرأ للتو أ العرض التقديمي لمعاينة Java 7 (pdf) وكان هناك شريحة على الدعوة بالسلاسل.فيما يلي المثال المستخدم في الشريحة:

// Construction with setters
DrinkBuilder margarita = new DrinkBuilder();
margarita.add("tequila");
margarita.add("orange liqueur");
margarita.add("lime juice");
margarita.withRocks();
margarita.withSalt();
Drink drink = margarita.drink();

// Construction with chained invocation
Drink margarita = new DrinkBuilder()
    .add("tequila")
    .add("orange liqueur")
    .add("lime juice")
    .withRocks()
    .withSalt()
    .drink();

ولدي مشاعر مختلطة حول هذا الموضوع.لا ينبغي للمرء أن يربط عددًا كبيرًا جدًا من استدعاءات الطريقة في عبارة واحدة.ومن ناحية أخرى الكتابة margarita.this() و margarita.that() ليست مريحة للغاية أيضًا.

الآن، أنا قادم إلى Java من عالم دلفي.وفي دلفي هناك with بناء اللغة.هذا يعتز به البعض ويكرهه الكثيرون (أم أن الأمر على العكس من ذلك؟).وجدت with لتكون أكثر أناقة من فكرة الاحتجاج المقيد (الذي أعتقد أنه يعمل على أساسه void طريقة إرجاع مرجع إلى الكائن الذي تم استدعاءه عليه - وهذا هو الجزء الذي لا أحبه، مثل void يجب أن يعود لا شئ).

وسأكون ممتنا with ميزة اللغة التي تعتمدها Java، لذلك يمكن كتابة رمز المثال على النحو التالي:

Drink margarita = null;
with (new DrinkBuilder()) {
    add("tequila");
    add("orange liqueur");
    add("lime juice");
    withRocks();
    withSalt();
    margarita = drink();
}

هل أنا الوحيد الذي يفضل هذا الحل على الاحتجاج المتسلسل؟أي شخص آخر يشعر بذلك with يمكن أن يكون امتدادا مفيدا للغة جافا؟(يذكرني بسؤال أحدهم حول الحاجة إلى "Java++"...)

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

المحلول

ال مع يمكن ترجمة البيان في Java باستخدام فئات مجهولة مع مُهيئ:

Drink margarita = new DrinkBuilder() {{
    add(“tequila”);
    add(“orange liqueur”);
    add(“lime juice”);
    withRocks();
    withSalt();
}}.drink();

تم توثيق سلبيات استخدام هذا المصطلح جيدًا هنا.

يعد الاستدعاء المتسلسل اسمًا مستعارًا لتسلسل الأسلوب.هذا مصطلح معروف جيدًا ويعمل مع أي إصدار من Java:

class Chained {

    public Chained withFoo() { 
        // ...
        return this;
    }

    public Chained withBar() { 
        // ...
        return this;
    }
}    

اقتراح لـ JDK 7 هو السماح بطريقة التسلسل أيضًا لنوع الإرجاع الفارغ:

class ChainedJava7 {

    public void withFoo() { 
        // ...
    }

    public void withBar() { 
        // ...
    }
}    

نصائح أخرى

هذا قد تهمك.

وأنا تماما مثل البيانات with من هذا الشكل ولكن أنا أفضل نسخة VB منهم:

With testObject
    .Height = 100
    .Text = "Hello, World"
    .ForeColor = System.Drawing.Color.Green
End With

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

إذا أخذنا المثال الخاص بك:

with (new DrinkBuilder()) {
    add(“tequila”);
    add(“orange liqueur”);
    add(“lime juice”);
    withRocks();
    withSalt();
    margarita = drink();
}

وليس هناك طريقة سهلة لمعرفة ما إذا كان withSalt() هو وسيلة لDrinkBuilder أو أسلوب في الدرجة المحلية. إذا كنت لا تسمح أساليب الكائن with افتتاحية في كتلة with ثم أعتقد أنها تصبح أقل فائدة بكثير.

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

وربما العديد من العديد من المكالمات إلى كائن واحد هي علامة على أن يحتاج بعض التعليمات البرمجية لنقلها من مكان؟

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

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