静态工厂方法与Comparable接口实现的实例

    技术2023-11-27  73

    工作之余写一个小例子来总结写静态工厂方法的用法,毕竟静态工厂方法在很多框架都有用到,是这些框架的基础实现方法,顺便整理下Comparable接口的使用。

    1、使用静态工厂方法并实现Comparable接口的实例类

    public class Student implements Comparable<Student> { private Integer id; private String name; private Integer age; public Student() { } public Student(Integer age,String name) { this.age=age; this.name=name; } //方法一 public static Student getStudent(Integer id,String name,Integer age){ Student student=new Student(); student.id=id; student.name=name; student.age=age; return student; } //方法二 public static Student[] getStudentByArrays(Map<Integer,String> ageAndName){ Student[] students=new Student[ageAndName.size()]; Set<Map.Entry<Integer, String>> entries = ageAndName.entrySet(); Iterator<Map.Entry<Integer, String>> iterator = entries.iterator(); int i=0; while (iterator.hasNext()){ Map.Entry<Integer, String> next = iterator.next(); students[i]=new Student(next.getKey(),next.getValue()); Student stu=students[i]; stu.setId(i+1); i++; } return students; } public void setId(Integer id) { this.id = id; } public void setAge(Integer age){ this.age=age; } public void setName(String name) { this.name = name; } public Integer getId() { return id; } public Integer getAge() { return age; } public String getName() { return name; } @Override public int compareTo(Student stu) { if(age<stu.age){ return -1; }else if(age>stu.age){ return 1; }else{ return 0; } } @Override public String toString() { return "第"+id+"号的"+name+"同学是"+age+"岁"; } }

    这里我们写了两个静态工厂方法进行实例化,第一个方法与普通的含参构造方法无异,返回的是有参的实例对象;第二个方法用了以年龄与姓名为kv的Map,id则在方法中实现自增,以获取Map键值对并用迭代器遍历的方法给对象循环赋初始值,创建的实例对象个数为Map的size,最后返回含多个Student实例的数组。这里我们将Comparable接口的compareTo方法重写,按照年龄大小升序排序。

    2、类对象的实例化

    public class TestComparable { public static void main(String[] args) { //第一种方法 List<Student> students= new ArrayList<Student>(); students.add(Student.getStudent(1,"terry",22)); students.add(Student.getStudent(2,"pony",21)); Collections.sort(students); Iterator<Student> iterator = students.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } System.out.println("---------------------------------"); //第二种方法 Map<Integer,String> ageAndName= new HashMap<Integer, String>(); ageAndName.put(21,"pony"); ageAndName.put(22,"terry"); int size = ageAndName.size(); Student[] stus=Student.getStudentByArrays(ageAndName); Arrays.sort(stus); for (Student student : stus) { System.out.println(student); } } }

    这里我们用第一个静态工厂方法创建单个实例,并且将实例对象放入List中由于我们将要对比的是List集合,所以我们用到的sort()排序方法是Collections工具中的,在排序后用迭代器将实例遍历输出;我们再用Map存储实例对象的年龄和姓名,并用第二个方法来将两个实例创建出来,由于返回的是数组,所以我们用到的sort()排序方法是Arrays工具类的,排好序后通过foreach遍历输出。

    3、结果

    第2号的pony同学是21岁 第1号的terry同学是22岁 --------------------------------- 第1号的pony同学是21岁 第2号的terry同学是22岁

    结果正如预感的一样,对象按年龄进行了正序排序,但是,两者的编号不一样,原来是compareTo方法已经在传参之前让Map中的元素按年龄升序排序了,所以年龄小的对象会先进行实例化并且赋上id的值。

    4、静态工厂方法的好处

    具体好处点此查看

    Processed: 0.011, SQL: 9