EJB HashMap如何实现比较两个对象的方法

时间:2015-09-25 13:56:52

标签: java hashmap ejb stateful

这是一个EJB项目。我需要实现一个比较两个或更多对象的函数,我可以在单击“添加”或“删除”按钮后添加或删除一个对象。因此,我的想法是将对象存储在HashMap中,然后比较它们并采取最好的方法。但是当我运行我的方法时,HashMap为null。方法无法在其中添加对象。如何使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);
    }
}

}

1 个答案:

答案 0 :(得分:0)

如果此类之外的其他一些代码将其设置为null,则

map本身只能为null。 (这不太可能,但你原则上应该map字段private

看到堆栈跟踪会很好,但我看到的一个大问题是getBestPerRoom()中的逻辑错误: 如果地图至少有一个条目,则此方法有效,但如果它是空的,则返回0.如果您的代码尝试使用此作为propertyId调用其他方法,则它们将获得null进入和(如果他们没有仔细检查)将获得NPE 为了避免这些问题,您需要正确处理没有条目的情况。

更一般地说,有更好的方法来构造这个代码--OO原则建议你应该使用Property类来封装有关不同属性的所有信息。然后,您可以通过编写Comparator(或者只是将它们存储在TreeSet中)按价格对它们进行排序 如果您正在编写EJB应用程序,这还允许您使用JPA轻松地将Properties存储在数据库中。