30분 시작 Java8의 기본 방법 및 정적 인터페이스 방법 학습

앞말
지난 글30분 시작 Java8의 lambda 표현식에서 우리는 람다 표현식을 배웠다.이제 자바8의 새로운 언어 특성에 대한 학습을 계속합니다. 오늘 우리가 배워야 할 것은 기본 방법과 정적 인터페이스 방법입니다.
이 Java8의 새로운 언어 기능은 Android N에서도 지원됩니다.Android 개발에서 Java8의 개발 환경을 설정하는 방법은 이전 글30분 동안 Java8의 lambda 표현식을 시작합니다.을 참조하십시오.
기본 방법
기본 방법은 우리로 하여금 소프트웨어 라이브러리의 인터페이스에 새로운 방법을 추가할 수 있게 하고, 이 인터페이스를 사용하는 오래된 버전 코드에 대한 호환성을 확보할 수 있게 한다.
다음은 간단한 예를 통해 다음 기본 방법을 깊이 있게 이해합니다.
1. 어느 날, PM은 우리 제품이 시간과 날짜를 받아야 한다고 말했다.그래서 우리는 날짜 시간을 설정하고 가져오는 인터페이스 클래스인 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(); 

 } 
그리고 이 인터페이스의 실현 클래스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이 우리 이 제품은 국내용뿐만 아니라 다양한 시간대의 고객들도 사용한다고 합니다.그래서 당신에게 새로운 수요를 증가시켰습니다: 지정된 시간대의 날짜와 시간을 얻기
이전에 우리는 모두 이렇게 했다.
인터페이스 다시 쓰기, 추가 방법

 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); 

 }
이렇게 하면 우리의 실현류도 상응하여 다시 써야 한다.

 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(); 

      } 

    }   

  } 
이렇게 쓰면 TimeClient 인터페이스를 실현한 모든 종류를 다시 써야 한다.이것은 우리의 실현 수요에 대한 부담을 크게 증가시켰다.
바로 자바 인터페이스에서 추상적인 방법만 정의할 수 있는 문제를 해결하기 위해서다.Java8에는 기본 메서드의 특성이 새로 추가되었습니다.다음은 기본 방법을 사용하여 수요를 실현할 것입니다.

 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)); 

    } 

 } 

기본 방법 키워드는 default 입니다. 이전에 우리는 인터페이스에서만 실현되지 않은 방법을 정의할 수 있었습니다.기본 방법이 있으면 우리는 완전한 방법을 작성할 수 있다.
이렇게 하면 우리는 계승 인터페이스의 실현 클래스를 수정할 필요가 없고 인터페이스에 새로운 방법을 추가하여 실현할 수 있다.

 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{ 

 } 
다음 테스트 코드를 통해 Another TimeClient 인터페이스가 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) 
기본 방법을 다시 성명하면 이 방법을 추상적인 방법으로 바꿀 수 있다

 // ,  

 public  interface  AbstractZoneTimeClient  extends  TimeClient{ 

    @Override 

    ZonedDateTime getZonedDateTime(String zoneString); 

 } 
테스트에서 getZonedDateTime 방법이 기본 방법에서 추상적인 방법으로 변경됨을 알 수 있습니다.

 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()); 

      } 

    } 

 } 
HandleInvalidZoneTimeClient 인터페이스를 실현하는 클래스는 다시 쓴 getZonedDateTime 방법을 가지고 있다.
정적 방법
Java8의 인터페이스에서 우리는 기본 방법뿐만 아니라 정적 방법도 쓸 수 있다.위의 예에서 정적 방법을 마침 썼다.

 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)); 

    }   

 } 

이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기