[英]Efficient way to implement HashMap<Boolean, Object>: Java
我有一個函數,我必須發送一個對象的兩個狀態:
void functionA(MyObject objStateOff, MyObject objStateOn){
}
而且總是只有兩種類型的狀態:on和off但是這個函數沒有兩個相同類型的參數,我希望將它們組合起來。 所以我想有一個HashMap<Boolean, MyObject>.
但由於這張地圖最多只包含兩個條目,因此我似乎在浪費資源,因為我正在為Android開發。
那么,有沒有更好的方法來傳遞這兩個對象,而沒有兩個使用HashMap或在函數簽名中有兩個參數?
更新:我想看看是否有任何其他方法基本上可以改善以下內容:可讀性,性能(即使我認為不會改變)和可維護性
謝謝。
我將創建一個自定義類,其中包含兩個MyObject
字段和每個字段的訪問器。 根據您的目標,這有幾個很大的優勢:
states.get(true)
,這是什么意思? states.getFooOnState()
,很明顯讓我知道foo何時開啟狀態。 MyObject
,或者你想要添加在foo打開或關閉時觸發的事件處理程序。 一個缺點,以你目前的做法是,這些事情會通過你的簽名級聯: functionA
需要增加一個新的說法,這意味着functionB
這就要求functionA
需要現在獲得額外的參數(因此它可以把它傳遞給functionA
),其中意味着functionC
需要得到它,等等。 對可讀性問題的一個警告是,在使用這些MyObject
,您將獲得可讀性,但不會在首次設置它們的地方獲得。 在那里,你將創建一個新的MyObjectState
(或任何你命名的),構造函數看起來就像你的functionA
一樣通用:
MyObjectState s = new MyObjectState(objStateOff, objStateOn);
您可以通過為MyObjectState
創建構建器來解決這個問題,但這可能有點過分。
性能方面,你不會比現有的更好。 但是一個自定義類將在宏觀方案中增加相當小的開銷(就額外內存,GC活動等而言)。
始終有Pair
類( http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/tuple/Pair.html )。 或者您可以使用兩個元素傳遞MyObject[]
。
我認為這個問題沒有唯一正確的答案。 我個人會給這個函數留下兩個參數,因為這並不是太多,這些參數的名稱可以幫助我避免混淆,比如“地圖/數組的哪個元素用於狀態?”。
你總是可以使用作文。
創建一個包含兩個MyObject
類型對象的類。
一開始可能看起來有點過頭了,但它比陣列更安全。
希望這可以幫助。
您可以使用簡單的ArrayList。
ArrayList<MyObject> a = new ArrayList<MyObject>();
a.add(objStateOff); a.add(objStateOn);
void functionA(ArrayList<MyObject>) {
...
}
functionA(a);
或者一個簡單的參數邏輯:
void functionA(int x) {
MyObject state;
if (x == 0) {
MyObject state = objStateOff; // Supposing they were defined somewhere before.
} else if (x == 1) {
MyObject state = objStateOn;
}
if (state != null) {
// Use MyObject state.
}
}
通過這種方式,您不需要指定任何約定,只需在參數上設置off或on(您可以使用字符串或布爾值而不是int(我的意思是,您可以使用“ON”或“ OFF“,字面意思))。
如果你的要求是有兩個對象狀態,那么為什么你在MyObject中沒有像boolean stateOfObject那樣的字段。 然后在functionA中,您可以檢查狀態並執行所需的邏輯。 當你只有兩個狀態時,為什么通過發送兩個對象來復雜化? 可能您必須提到您正在使用它的上下文以及當對象只能處於一種狀態時需要將兩個對象傳遞給函數的原因。 也許你可以使用枚舉:
public enum StateOfObject {
ON(10,2),
OFF(15,5);
private final int length;
private final int speed;
StateOfObject(int length, int speed) {
this.length = length;
this.speed = speed;
}
public MyObject getObject() {
MyObject myObj = new MyObject();
myObj.setLength(this.length);
myObj.setSpeed(this.speed);
return myObj;
}
}
像這樣使用它:
MyObject onObject = StateOfObject.ON.getObject();
System.out.print("Length: " + onObject.getLength() +
" Speed: " + onObject.getSpeed());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.