簡體   English   中英

Java-最好選擇靜態或非靜態方法

[英]Java - what is better to choose, static or nonstatic methods

因此,我想創建一個將在其中創建一些對象的類,然后將它們添加到Map中。 將有三張地圖。 對象1,對象2的映射以及對象2和對象1之間的關系的映射。 像現在一樣,我有這樣的事情:

public class SomeClass {
    private static final Map<Integer, Object1> OBJECTS1 = new HashMap<>();
    private static final Map<Integer, Object2> OBJECTS2 = new HashMap<>();
    private static final Map<Integer, List<Integer>> OBJECTS2_IN_OBJECTS1 = new HashMap<>();

    static {
        Object1 object1 = new Object1(1, "someStringForObject1");
        Object2 object2 = new Object2(1, "someStringForObject2");

        object1.setObject2(object2);
        OBJECTS1.put(object1.getId(), object1);
        OBJECTS2.put(object2.getId(), object2);

        SomeClass.addObject2ToObject1(object2.getId(), object1.getId());
    }

    public static Collection<Object1> getObjects1() {
        return OBJECTS1.values();
    }

    public static Object1 getObject1(int id) {
        return OBJECTS1.get(id);
    }

    public static void addObject1(Object1 object1) {
        OBJECTS1.put(object1.getId(), object1);
    }

    public static Collection<Object2> getObjects2() {
        return OBJECTS2.values();
    }

    public static Object2 getObject2(int id) {
        return OBJECTS2.get(id);
    }

    public static void addObject2(Object2 object2) {
        OBJECTS2.put(object2.getId(), object2);
    }

    public static void addObject2ToObject1(int object2Id, int object1Id) {
        List<Integer> objects1OfObject2 = OBJECTS2_IN_OBJECTS1.get(object2Id);
        if (objects1OfObject2 != null) {
            objects1OfObject2.add(object1Id);
            OBJECTS2_IN_OBJECTS1.put(object2Id, objects1OfObject2);
        } else {
            objects1OfObject2 = new ArrayList<>();
            objects1OfObject2.add(object1Id);
            OBJECTS2_IN_OBJECTS1.put(object2Id, objects1OfObject2);
        }
    }
}

后來在其他類中,我想例如將對象添加到地圖等。只需在這些地圖上進行一些操作即可。 例如:

class SomeOtherClass{
    public Collection getObjects() {
        return SomeClass.getObjects1();
    }

    public Object1 addObject1(int idOfObject1, String someString, int idOfObject2) {
        if (SomeClass.getObject1(idOfObject1) != null) {
            System.out.prinltn("Object with this id already exists.");
            return null;
        }

        Object1 object1 = new Object1(idOfObject1, someString);
        SomeClass.addObject2ToObject1(idOfObject2, idOfObject1);

        SomeClass.addObject1(object1);
        return object1;
    }
}

所以這是我的問題。 “ SomeClass”中的方法應該是靜態或非靜態的,因此我將在每種方法中創建“ SomeClass”對象:

class SomeOtherClass{
    public Collection getObjects() {
        SomeClass someClass = new SomeClass();
        return someClass.getObjects1();
    }

    public Object1 addObject1(int idOfObject1, String someString, int idOfObject2) {
    SomeClass someClass = new SomeClass();
        if (someClass.getObject1(idOfObject1) != null) {
            System.out.prinltn("Object with this id already exists.");
            return null;
        }

        Object1 object1 = new Object1(idOfObject1, someString);
        someClass.addObject2ToObject1(idOfObject2, idOfObject1);

        someClass.addObject1(object1);
        return object1;
    }
}

通用規則是: 靜態是OO設計中的異常 應該是例外 這將導致您的班級之間的緊密聯系 玩起來不好 既沒有多態性,也沒有單元測試。

因此:僅在有充分理由時才使用靜態

查看您的示例代碼,我真的看不到使用靜態方法做任何事情的需要或前面提到的“充分理由”。 所以我的建議是:退后一步; 並簡單地閱讀。 喜歡在這里那里 (尤其是阿爾弗雷德的答案)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM