سؤال

في ترميز 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

http://google-collections.googlecode.com/svn/trunk/javadoc/index.html؟com/google/common/collect/multimap.html

إضافة إلى الإجابات الأخرى:

لفها.

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

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