枚举 (enum)
高级的多例模式
java中枚举使用enum关键字定义枚举
枚举就是一种多例设计模式
enmu Color{
RED,BLUE,GREEN;
}
enum Color{
RED,BULE,GREEN;
}
public class Test {
public static void main(String[] args) {
System.out.println(Color.GREEN);
}
}
1 . 枚举类(Enum类)
JDK 1.5 新增的enum枚举结构并不是新的结构。
使用enum定义的枚举本质上是一个类,默认继承java.lang.Enum父类。
取得枚举名称:
public fianl String name()
取得枚举编号:
public final int ordinal()
取得所有枚举对象(静态方法)
枚举类.values(): Enum[]
enum Color{
RED,BULE,GREEN;
}
public class Test {
public static void main(String[] args) {
System.out.println(Color.GREEN);
System.out.println(Color.GREEN.ordinal()+"="+Color.GREEN.name());
for(Color temp:Color.values()){
System.out.println(temp.ordinal()+"="+temp.name());
}
}
}
面试:请解释enum与Enum区别:
enum是一个关键字,使用enum定义的枚举类本质上就相对于一个类继承了Enum这个抽象类而已。
2 . 枚举中定义其他结构,枚举对象必须放在首行声明(语法要求)
构造方法使用private修饰私有化(相当于多例模式,构造方法必须私有化,)
enum Color{
RED("红色"),BULE("蓝色"),GREEN("绿色");
private String title;
private Color(String title){
this.title=title;
}
@Override
public String toString() {
return this.title;
}
}
public class Test {
public static void main(String[] args) {
System.out.println(Color.GREEN);
}
}
枚举可以实现接口,此时枚举中的每个对象都成为接口对象;
interface IColor{
public String getColor();
}
enum Color implements IColor{
RED("红色"),BULE("蓝色"),GREEN("绿色");
private String title;
private Color(String title){
this.title=title;
}
@Override
public String toString() {
return this.title;
}
@Override
public String getColor() {
return this.title;
}
}
public class Test {
public static void main(String[] args) {
IColor iColor=Color.GREEN;
System.out.println(iColor.getColor());
}
}
注解(Annotation)
1 . 准确覆写(@Override)
检查当前类中的覆写方法与父类定义的方法是否相同,如果有任何一个地方不相同,编译报错
2 . 声明过期处理(@Deprecated)
原有类或者方法在旧版本没有问题,但是在新版本不推荐使用,可以加上@Deprecated注释,明确表示不建议用户使用此类,方法
package www.Dyson.java;
class Person{
@Deprecated //表明该方法已经不建议使用,但是使用了也并不会出错
public Person(){};
public Person(String name){};
}
public class Test {
public static void main(String[] args) {
Person per1=new Person(); //标记处过期方法
Person per2=new Person("Dyson");
}
}
3 . 压制警告(@SuppressWarnings)
当调用某些操作可能产生问题的时候就会产生警告信息,警告信息并不是异常(Exception)
使用之前:
使用之后:
JDK1.8接口定义加强(了解)
JDK1.8开始接口允许出现以下两种方法
1 . 可以使用default来定义普通方法,需要同过对象来调用
2 . 可以使用static来定义静态方法,同过接口名就可以定义
package www.Dyson.java;
interface IMessage{
//追加普通方法
public default void fun(){
System.out.println("Hello IMessage");
}
//定义一静态方法,由接口名称直接调用
public static IMessage getInstance(){
return new MessageImpl();
}
public void print();
}
class MessageImpl implements IMessage{
@Override
public void print() {
System.out.println("Hello MessageImpl");
}
}
public class Test {
public static void main(String[] args) {
IMessage message=IMessage.getInstance();
System.out.println(message);
message.print();
message.fun();
}
}
函数式编程 Lambda表达式
要是用函数式编程有一个前提:接口必须有一个方法。如果接口中存在两个以上的方法,无法使用函数式编程!
如果现在某个接口为了函数式编程而生,@FunctionalInterface定义在接口上,检查此接口是否只存在一个方法
lambda表达式语法:
单行无返回值,单行有返回值:
()-> ... 方法代码;
多行有返回值:
()-> {
...
...
return 返回值语句;
};
范例:传统面向对象开发
package www.Dyson.java;
interface IMessage{
public void print();
}
public class Test {
public static void main(String[] args) {
IMessage message=new IMessage(){ //匿名内部类
@Override
public void print(){ //必须编写完整语法
System.out.println("Hello world");
}
};
message.print();
}
}
范例:函数式编程
package www.Dyson.java;
interface IMessage{
public void print();
}
public class Test {
public static void main(String[] args) {
IMessage message=()-> System.out.println("Hello world");
message.print();
}
}