一、 java中的泛型:泛型的主要作用是使得一个集合(要明确主要是对于集合)只能存放一个同一类型的数据(包括引用类型和基本数据类型)。这样就可以避免同一集合中出现不同元素,导致我们无法用同一样的方法来处理这些数据。来,我们来看代码。
public class Testaa {
@Test
public void iii() {
DAO <User> dao =new DAO <User>(); //我们在这就声明了一个DAO的对象,要看清是DAO类的对象, user 只是个引用数据类型 dao.save("XIAOHUA", new User(1,32,"liudehua")); //调用DAO类中的save方法,存储数据。
dao.save("OHUA", new User(100,320,"xxx"));
User kk= dao.get("OHUA");
//这个其实还是用的集合中的知识,map存储的是键值对,这个方法可以用来获取“OHUA”所对应的Value值,也就是User类的对象,所以我们用User类的变量来接受啊(还是声明对象)。
System.out.println(kk.getName());
List jj=dao.list(); //同 User kk= dao.get("OHUA"); 这个语言类似。
System.out.println(jj);
}
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class DAO <T>{ //通过这个DAO <T>,我们不用事先知道这个类是处理或者存储什么数据的,我们只需要在声明这个
类的对象中声明即可。这样使得我们可以减少极大的冗余代码,减少我们的工作量。
public Map<String ,T> map= new HashMap<>(); // Map是个接口,这个就是接口声明(Map),后面是实现类的构造器。
public void save(String id,T entity) {
map.put(id, entity); //添加键值对。
}
public T get(String id) { //此处T是个数据类型,不是锤子手机的标志~~~
T t= map.get(id);
return t;
}
public List <T> list(){ //这个方法实现了把map中的键值对中的String值取出来放在一个集合中。再返回这个集合。
List<T> list =new ArrayList<>();
for (String s: map.keySet()) {
list.add(map.get(s));
}
return list;
}
class User{ //在这我们定义了一个User类
private int id;
private int age;
}
用一个通俗的比喻来说明泛型的作用。假设我们的厨房有很多小瓶子,这些瓶子也没有标签,也没有外包装,但是我们知道它们只能用来装液态的调味料之类(就像DAO<T>做的那样)。我们可以用它来装散装的酱油、醋、白酒之类的。然后我们有一天需要用酱油,在去打酱油的路上(这句话读着咋有点歧义),我们贴上“这是酱油瓶,只能放酱油“的外包装,这样以后我们再打酱油和用酱油时都不会和用来灌白酒的瓶子混合,相反我们会很清晰。
二、java中的枚举
枚举在数据和计算机科学中,一个集的枚举是列出某些有穷序列集的所有成员的程序(来自于百度百科)。java中的枚举的表现形式是一个类和有限个对象,我们可以清楚的知道一个特定类型有多少个对象。这个和现实很贴近。比如莱布尼茨虽然说,世界上没有两片相同的树叶,但是我们如果按地球上的每一种类的树的叶子都看成同一种树叶的话,那么地球上的树种虽然很多,但是还是有限的。这就是枚举。在java种,树叶就可以是类,不同种的树叶就构成了枚举。看code~
public class TestLeaves {
@Test
public void show() {
Leaf uu=Leaf.yangshu; // 在这,我们用uu来接受yangshu这个对象。它里面有height、shape等属性。
System.out.println(uu.getHeight());
String ii=" yangshu";
System.out.println(Leaf.valueOf(ii));
}
} enum Leaf{
yangshu (" 15米","杨树的叶子很漂亮"), //
其实是这个,public static final Leaf yangshu =new Leaf (" 15米","杨树的叶子很漂亮"); static修饰的属性或者方法,我们直接可以用类名可以调用(无需通过对象)。final的属性值不可改变。
shuishan (" 30米","水杉的叶子目前我还没看到"),
huaishu (" 10米","槐树的叶子很小"),
eryuelan (" 0.3米","二月兰的叶子比槐树的叶子还小");
private final String height; //
通过final和private关键字完成封装。
private final String shape;
private Leaf(String height, String shape) { //
只能通过构造器来在本类中给本类中的有限个对象赋值。
this.height = height;
this.shape = shape;
}
public String getHeight() {
//只有get方法,没有set方法,因为final关键字,所以我们只能通过构造器来给对象赋值。
return height;
}
public String getShape() {
return shape;
}
}
就我个人的感觉和理解而言,枚举是有限元素集合和switch语句的一种合体。列出某一类型中一共有多少个对象,然后在类中分别声明构造好,然后外部只能去使用,不能去修改。和现实对应的话,就是这一类事物从某一方面来看有多少个状态。比如说一个人当下的感情生活:单身狗(”我们给予安慰”)、恋爱中(“我们给予祝福”)、婚姻中(“我们祝福幸福美满“)。这样当我们在外部调用单身狗这个对象时,系统自动提示,我们给予安慰~~~