一个Bug的反思

对输入数据判重,使用Map,将对象作为Key,使用map的containsKey方法来着重是否是重复记录。
正常的处理流程:
(1)将输入的数据封装成对象
(2)判重,将没有重复的数据存储到map
(3)对没有重复的数据,进行校验
(4)将部分输入的数据,转换成数据库存储时的格式

问题:因为对已经存储在map中的对象中的字段进行了修改,即使后面的输入的对象与前一个重复,判重就会失效。
反思:
这个逻辑的流程是:(1)得到输入--》(2)判重--》(3)将部分字段的值更改成数据库存储的值--》(4)持久化
第三部,更改了对象的值,因为会导致判重的预期失效,见下例子

import java.util.HashMap;
import java.util.Map;

/*2015-9-20*/
public class MapDemo {
    public static void main(String[] args) {
        Map<Person, String> info = new HashMap<Person, String>();
        Person person = new Person("xiaoming", 1);
        info.put(person, person.getName());
        print(info, person);
        person.setSalary(2);
        System.out.println(String.format("Get a pay raise:%d to %d", 1, 2));
        print(info, person);
        person = new Person("xiaoming", 1);
        print(info, person);
    }

    private static void print(Map<Person, String> info, Person person) {
        System.out.println(String.format("get '%s' from '%s'.Result: '%s'", person, info, info.get(person)));
    }

}

class Person {
    private String name;
    private int salary;

    public Person(String name, int salary) {
        super();
        this.name = name;
        this.salary = salary;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", salary=" + salary + "]";
    }

}

Output:

get 'Person [name=xiaoming, salary=1]' from '{Person [name=xiaoming, salary=1]=xiaoming}'.Result: 'xiaoming'
Get a pay raise:1 to 2
get 'Person [name=xiaoming, salary=2]' from '{Person [name=xiaoming, salary=2]=xiaoming}'.Result: 'xiaoming'
get 'Person [name=xiaoming, salary=1]' from '{Person [name=xiaoming, salary=2]=xiaoming}'.Result: 'null'

 

posted @ 2015-09-20 21:24  沧海一滴  阅读(371)  评论(0编辑  收藏  举报