欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

一文教你使用Java8中的靜態(tài)接口方法

一文教你使用Java8中的靜態(tài)接口方法?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

創(chuàng)新互聯(lián)建站,是成都地區(qū)的互聯(lián)網(wǎng)解決方案提供商,用心服務(wù)為企業(yè)提供網(wǎng)站建設(shè)、重慶APP開發(fā)、小程序定制開發(fā)、系統(tǒng)按需制作和微信代運營服務(wù)。經(jīng)過數(shù)十多年的沉淀與積累,沉淀的是技術(shù)和服務(wù),讓客戶少走彎路,踏實做事,誠實做人,用情服務(wù),致力做一個負責任、受尊敬的企業(yè)。對客戶負責,就是對自己負責,對企業(yè)負責。

默認方法

默認方法讓我們能給我們的軟件庫的接口增加新的方法,并且能保證對使用這個接口的老版本代碼的兼容性。

下面通過一個簡單的例子來深入理解下默認方法:

1.一天,PM說我們的產(chǎn)品需要獲取時間和日期。于是我們就寫了一個設(shè)置和獲取日期時間的接口類 TimeClient 。

 public  interface  TimeClient { 

    void setTime(int hour,int  minute,  int  second); 

    void  setDate( int  day,  int  month,  int  year); 

    void  setDateAndTime( int  day,  int  month,  int  year, 

              int  hour,  int  minute,  int  second); 

    LocalDateTime getLocalDateTime(); 

 } 

以及這個接口的實現(xiàn)類 SimpleTimeClient :

public  class  SimpleTimeClient  implements  TimeClient {

    private  LocalDateTime localDateTime;

    public  SimpleTimeClient(){ 

      localDateTime = LocalDateTime.now(); 

    } 

    @Override 

    public  void  setTime( int  hour,  int  minute,  int  second) { 

      LocalTime localTime = LocalTime.of(hour, minute, second); 

      LocalDate localDate = LocalDate.from(localDateTime); 

      localDateTime = LocalDateTime.of(localDate,localTime); 

    } 

 

    @Override 

    public  void  setDate( int  day,  int  month,  int  year) { 

      LocalDate localDate = LocalDate.of(day, month, year); 

      LocalTime localTime = LocalTime.from(localDateTime); 

      localDateTime = LocalDateTime.of(localDate, localTime); 

    } 

 

    @Override 

    public  void  setDateAndTime( int  day,  int  month,  int  year,  int  hour,  int  minute,  int  second) { 

      LocalDate localDate = LocalDate.of(day, month, year); 

      LocalTime localTime = LocalTime.of(hour, minute, second); 

      localDateTime = LocalDateTime.of(localDate, localTime); 

    } 

 

    @Override 

    public  LocalDateTime getLocalDateTime() { 

      return  localDateTime; 

    } 

 

    @Override 

    public  String toString() { 

      return  localDateTime.toString(); 

    } 

 

    public  static  void  main(String[] args) { 

      TimeClient timeClient =  new  SimpleTimeClient(); 

      System.out.println(timeClient.toString()); 

    } 

 } 

2.可是PM說我們這個產(chǎn)品吶,不光國內(nèi)用,各種其他時區(qū)的顧客也會使用。于是給你增加了新的需求:獲取指定時區(qū)的日期和時間

以往我們都會這么做:

重寫接口,增加方法

 public interface TimeClient { 

    void setTime(int hour,int minute,int second); 

    void setDate(int day,int month,int year); 

    void setDateAndTime(int day,int month,int year,int hour, int minute,int second); 

    LocalDateTime getLocalDateTime(); 

    //新增的方法              

    ZonedDateTime getZonedDateTime(String zoneString); 

 }

這樣我們的實現(xiàn)類也要相應(yīng)的進行重寫。

 public  class  SimpleTimeClient  implements  TimeClient {

    private  LocalDateTime localDateTime; 

    ... 

    ZonedDateTime getZonedDateTime(String zoneString){ 

     return  ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString)); 

    }    

    static  ZoneId getZoneId (String zoneString) { 

      try  { 

        return  ZoneId.of(zoneString); 

      }  catch  (DateTimeException e) { 

        System.err.println( "Invalid time zone: "  + zoneString + 

          "; using default time zone instead." ); 

        return  ZoneId.systemDefault(); 

      } 

    }   

  } 

這樣寫會導致我們要去重寫每個實現(xiàn)了 TimeClient 接口的類。而這大大增加了我們的實現(xiàn)需求的負擔。

正是為了解決Java接口中只能定義抽象方法的問題。Java8新增加了默認方法的特性。下面讓我們來使用默認方法實現(xiàn)需求。

 public  interface  TimeClient { 

    void  setTime( int  hour,  int  minute,  int  second); 

    void  setDate( int  day,  int  month,  int  year); 

    void  setDateAndTime( int  day,  int  month,  int  year, 

      int  hour,  int  minute,  int  second); 

    LocalDateTime getLocalDateTime();              

    static  ZoneId getZoneId (String zoneString) { 

      try  { 

        return  ZoneId.of(zoneString); 

      }  catch  (DateTimeException e) { 

        System.err.println( "Invalid time zone: "  + zoneString + 

          "; using default time zone instead." ); 

        return  ZoneId.systemDefault(); 

      } 

    } 

    //默認方法 

    default  ZonedDateTime getZonedDateTime(String zoneString) { 

      return  ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString)); 

    } 

 } 

默認方法關(guān)鍵字為 default ,以往我們只能在接口中定義只有聲明沒有實現(xiàn)的方法。有了默認方法,我們就能編寫完整的方法。

這樣我們就不需要修改繼承接口的實現(xiàn)類,就給接口添加了新的方法實現(xiàn)。

 public  static  void  main(String[] args) { 

      TimeClient timeClient =  new  SimpleTimeClient(); 

      System.out.println(timeClient.toString()); 

      System.out.println(timeClient.getZonedDateTime( "test" )); 

    } 

繼承含有默認方法的接口

當我們繼承含有默認方法的接口時,一般有以下三種情況

不去管默認方法,繼承的接口直接繼承默認方法

 //1.不去管默認方法 
 public  interface  AnotherTimeClient  extends  TimeClient{ 

 } 

通過下面的測試代碼,我們知道AnotherTimeClient接口直接繼承了TimeClient接口的默認方法 getZonedDateTime

 Method[] declaredMethods = AnotherTimeClient. class .getMethods(); 

      for (Method method:declaredMethods){ 

        System.out.println(method.toString()); 

      }  

 //output: 

 //public default java.time.ZonedDateTime xyz.johntsai.lambdademo.TimeClient.getZonedDateTime(java.lang.String) 

重新聲明默認方法,這樣會使得這個方法變成抽象方法

 //重新聲明默認方法,使之變?yōu)槌橄蠓椒?

 public  interface  AbstractZoneTimeClient  extends  TimeClient{ 

    @Override 

    ZonedDateTime getZonedDateTime(String zoneString); 

 } 

測試可以發(fā)現(xiàn) getZonedDateTime 方法由默認方法變?yōu)榱顺橄蠓椒?

 Method[] methods = AbstractZoneTimeClient. class .getMethods(); 

      for (Method method:methods){ 

        System.out.println(method.toString()); 

      } 

 //output:    

 //public abstract java.time.ZonedDateTime xyz.johntsai.lambdademo.AbstractZoneTimeClient.getZonedDateTime(java.lang.String) 

重新定義默認方法,這樣會使得方法被重寫

 //3.重新定義默認方法 

 public  interface  HandleInvalidZoneTimeClient  extends  TimeClient { 

    default  ZonedDateTime getZonedDateTime(String zoneString){ 

      try  { 

        return  ZonedDateTime.of(getLocalDateTime(), ZoneId.of(zoneString)); 

      }  catch  (DateTimeException e) { 

        System.err.println( "Invalid zone ID: "  + zoneString + 

            "; using the default time zone instead." ); 

        return  ZonedDateTime.of(getLocalDateTime(),ZoneId.systemDefault()); 

      } 

    } 

 } 

實現(xiàn) HandleInvalidZoneTimeClient 接口的類將擁有重寫過的 getZonedDateTime 方法。

靜態(tài)方法

在Java8的接口中,我們不光能寫默認方法,還能寫靜態(tài)方法。上面的例子中正好用到了靜態(tài)方法。

 public  interface  TimeClient { 

    // ... 

    static  public  ZoneId getZoneId (String zoneString) { 

      try  { 

        return  ZoneId.of(zoneString); 

      }  catch  (DateTimeException e) { 

        System.err.println( "Invalid time zone: "  + zoneString + 

          "; using default time zone instead." ); 

        return  ZoneId.systemDefault(); 

      } 

    } 

 

    default  public  ZonedDateTime getZonedDateTime(String zoneString) { 

      return  ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString)); 

    }   

 } 

看完上述內(nèi)容,你們掌握一文教你使用Java8中的靜態(tài)接口方法的方法了嗎?如果還想學到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

分享文章:一文教你使用Java8中的靜態(tài)接口方法
分享路徑:http://chinadenli.net/article22/goihjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導航建站公司網(wǎng)站改版網(wǎng)站策劃品牌網(wǎng)站設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名