هل يمكنني إضافة إلى قائمة خاصة مباشرة من خلال Getter؟

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

  •  23-08-2019
  •  | 
  •  

سؤال

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

لدي فئة لديها قائمة خاصة. أريد أن أضيف إلى تلك القائمة الخاصة من خلال طريقة GetMylist العامة ().

لذلك ... هل هذا العمل؟

public class ObA{
 private List<String> foo;
public List<String> getFoo(){return foo;}
}

public class ObB{
   public void dealWithObAFoo(ObA obA){
     obA.getFoo().add("hello");

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

المحلول

نعم، من شأنها أن تعمل تماما - وهو عادة ما يكون شيئا سيئا. (هذا لأنك تعيد حقا المرجعي إلى كائن المجموعة، وليس نسخة من المجموعة نفسها.)

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

نصائح أخرى

في الواقع، ليست فكرة جيدة. لا تنشر أعضائك القابل للتنقل في الخارج، وجعل نسخة إذا لم تتمكن من تقديم نسخة للقراءة فقط على ذبابة ...

public class ObA{
  private List<String> foo;
  public List<String> getFoo(){return Collections.unmodifiableList(foo);}
  public void addString(String value) { foo.add(value); }
}

إذا كنت تريد رأي حول القيام بذلك، سأزيل getFoo() اتصل وإضافة add(String msg) و remove(String msg) الأساليب (أو أي وظيفة أخرى تريد كشفها) إلى OBA

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

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

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

أوه أيضا، كثيرا ما أجد أنني في النهاية يجب أن تخزين المزيد من البيانات مع الكائن الذي أتخزن فيه - لذلك أقوم بإنشاء كائن جديد (معروفا فقط داخل الحاوية "التي تضم المجموعة) ووضع الكائن داخل ذلك قبل وضعه في المجموعة.

إذا كنت قد حافظت على مجموعتك مقفلة، فهذا هو إعادة عدج تافهة. حاول أن تخيل مدى صعوبة أن تكون في بعض الحالات التي عملت فيها في المكان الذي لم تحتفظ به المجموعة مقفلة ...

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

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