1. 程式人生 > >java學習筆記(十)-- java新特性 (列舉 & 註解 & 介面定義加強 & Lambda表示式)

java學習筆記(十)-- java新特性 (列舉 & 註解 & 介面定義加強 & Lambda表示式)

列舉 (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();
    }
}