الاحتجاج المتسلسل في Java 7؟
-
06-07-2019 - |
سؤال
كنت أقرأ للتو أ العرض التقديمي لمعاينة 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 توصي بشدة استخدام باني عندما يكون لديك منشئ مع الكثير من الحجج. سبب واحد هو أنه يمكن أن تكون مكتوبة لضمان أن الكائن بنيت دائما في حالة متناسقة. كما أنه يتجنب الحاجة معقدة "الصانعين تصغير" في الصف الكائن بنيت في. لا يزال آخر هو أنه إذا كنت تريد الكائن الذي بني ليكون غير قابل للتغيير (على سبيل المثال، من أجل سلامة موضوع)، فإنه لا يمكن أن يكون أساليب اضع.