نوع أفضل سلامة في مجموعات Java
-
22-09-2019 - |
سؤال
في ترميز Java الخاص بي ، غالبًا ما ينتهي بي الأمر بالعديد Map<String,Map<String,foo>>
أو Map<String,List<String>>
ثم أواجه مشكلة في تذكر أي سلسلة هي المفتاح. أعلق الإعلان مع //Map<capabiltyId,Map<groupId,foo>>
أو //Map<groupId,List<capabilityId>
, ، لكنها ليست أكبر حل. إذا لم تكن السلسلة نهائية ، فسأقوم بعمل فصول جديدة CapabilityId extends String
و GroupId extends String
, ، لكن لا يمكنني ذلك. هل هناك طريقة أفضل لتتبع أي شيء هو المفتاح وربما يكون لدى المترجم فرضه؟
المحلول
عوضا عن الحصول CapabilityId
تمديد String
, CapabilityId
يمكن أن تشمل أ String
الحقل يسمى "المعرف" ؛ ثم الخاص بك Map
يمكن تعريفها على أنها Map<CapabilityId, Map<GroupId, Foo>>
, ، ويمكنك الحصول على حقول الهوية الفردية من خلال getId()
على فصولك الرئيسية.
لست متأكدًا من أنني سأفعل هذا بنفسي ، لكن إذا فعلت ذلك ، فربما يكون هذا ما سأفعله.
يمكنك الحد من الفوضى من خلال وجود abstract GenericId
الفصل مع حقل هوية و getId()
الطريقة ولديها CapabilityId
و GroupId
يرث منه.
نصائح أخرى
لف السلاسل في فئات الغلاف إذا كنت تريد:
class GroupId implements Comparable {
private String groupId;
public GroupId (String groupId) {
this.groupId = groupId;
}
...
}
Map<GroupId, List<CapabilityId>> m = ...
يخترع ID
الفصل الذي يمكنك فئة فرعية ، والذي يتكون من أ String
مجال وتطبيقات equals()
و hashCode()
التي تستخدم هذا الحقل.
أود أن أضع كل شيء في فئة واحدة وأستفيد من أسماء الحقل/الطريقة/الوسيطة المعقولة.
public class GroupCapabilities {
private Map<String, Map<String, Group>> groupCapabilities;
public void addGroup(String capabilityId, Group group) {
Map<String, Group> groups = groupCapabilities.get(capabilityId);
if (groups = null) {
groups = new HashMap<String, Group>();
groupCapabilities.put(capabilityId, group);
}
groups.put(group.getId(), group);
}
public Map<String, Group> getGroups(String capabilityId) {
return groupCapabilities.get(capabilityId);
}
public Group getGroup(String capabilityId, String groupId) {
Map<String, Group> groups = groupCapabilities.get(capabilityId);
return (groups != null) ? groups.get(groupId) : null;
}
// Etc..
}
وبهذه الطريقة ، يمكنك رؤية أسماء الأسلوب/الوسيطة ما يتوقعه/إرجاعه.
هناك عدد من الطرق للذهاب إلى هذا واحد (البعض المذكور سابقًا):
- كما roman ، لف نوع الغرض العام في نوع أكثر تحديدًا ، مما يعطي كتابة أقوى. كتابة قوية جيدة ، IMO.
- كـ @ناندا ، استخدم نوع مجموعة أكثر تحديدًا. مكتبة جافا فقيرة بعض الشيء في هذا المجال. يعتمد ذلك على شعورك تجاه التبعيات.
- كما palusc ، حرك جميع الأشياء icky إلى فئة icky. لا تزيل المشكلة حقًا ، لكنها تحتوي على (كما في Ghostbusters).
Map<String,Map<String,foo>>
يشبه إلى حد كبير أن لديك مفتاح مركب ، أي مفتاح يشتمل على جزأين. لذلك ، أدخل فئة مفتاح مركب غير قابل للتغيير ، وهو كائن قيمة يمثل كائنات قيمة المكون.
بدلاً من Map<String,List<String>>
يجب عليك استخدام Multimap من مجموعة Google Goaava / Google
إضافة إلى الإجابات الأخرى:
لفها.
إنه ليس مجرد حل لمشكلتك ولكن فكرة جيدة بشكل عام ، أي تجنب المعلمات البسيطة. سوف يكتسب الرمز الخاص بك قابلية القراءة والعقل والصيانة. يمكنك إضافة جميع أنواع الخصائص الرائعة إليها ، على سبيل المثال ، تعلن ذلك. كما اكتشفت ذلك ، من الأفضل أن تتذكر والتحكم. أنت تملك الفصل ويمكنك أن تفعل ما تريد به.