工作之余写一个小例子来总结写静态工厂方法的用法,毕竟静态工厂方法在很多框架都有用到,是这些框架的基础实现方法,顺便整理下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、静态工厂方法的好处
具体好处点此查看