2015-09-25 46 views
0

這是一個EJB項目。我需要實現一個比較兩個或更多對象的函數,並且一旦單擊「添加」或「刪除」按鈕,我就可以添加或刪除一個對象。因此,我的想法是將對象存儲在HashMap中,然後比較它們並採取最佳措施。但是當我運行我的方法時,HashMap爲空。方法不能在其中添加對象。如何使HashMap可以運行。我的代碼附在下面。EJB HashMap如何實現比較兩個對象的方法

@Stateful 
public class ComparePropertySessionBean implements ComparePropertySessionBeanRemote{ 

public HashMap<Integer, Double> map = new HashMap<Integer, Double>(); 

@Override 
public int getBestPerRoom() { 
    Iterator<Integer> iterator = map.keySet().iterator(); 
    int i = 0; 
    double ave = 10000000000.00; 
    if (iterator.hasNext()) { 
     Integer key = iterator.next(); 
     if (map.get(key) < ave) { 
      i = key; 
      ave = map.get(key); 
     } 
    } 

    return i; 
} 

@Override 
public void addCompareProperty(int propertyId, double price, int noofbedrooms) { 

    if (!map.containsKey(propertyId)) { 
     map.put(propertyId, price/noofbedrooms); 

    } 

} 

@Override 
public void removeCompareProperty(int propertyId) { 
    if (map.containsKey(propertyId)) { 
     map.remove(propertyId); 
    } 
} 

}

+0

你是說HashMap引用爲空?如果是這樣,程序應該崩潰。發佈錯誤消息 –

回答

0

map本身只能是空在這裏,如果這個類之外的一些其他的代碼被設置爲null。 (這是不太可能的,但你應該原則上使map字段private)。

這將是很好看的堆棧跟蹤,但我看到的最大的問題是在getBestPerRoom()一個邏輯錯誤: 此方法如果地圖上有至少一個條目,但如果它是空的則返回0 。如果你的代碼試圖用這個方法調用其他方法作爲propertyId,他們將得到一個空條目,並且(如果他們沒有仔細檢查)會得到一個NPE。
爲了避免這些問題,您需要妥善處理沒有條目的情況。

更一般地說,有很多更好的方法來構造這段代碼 - OO原則建議你應該使用Property類來封裝關於不同屬性的所有信息。然後,您可以通過編寫Comparator(或將它們存儲在TreeSet中)按價格對它們進行排序。
如果您正在編寫EJB應用程序,這也可以讓您使用JPA輕鬆地將您的Properties存儲在數據庫中。