2015-09-25 80 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存储在数据库中。