教你在Java接口中定义方法详解编程语言

 
 
基本上所有的Java教程都会告诉我们Java接口的方法都是public、abstract类型的,没有方法体的。
 
但是在JDK8里面,你是可以突破这个界限的哦。
 
假设我们现在有一个接口:TimeClient,其代码结构如下:
 
import java.time.*;
 
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类实现了TimeClient接口,具体代码如下:
 
package defaultmethods;
 
import java.time.*;
import java.lang.*;
import java.util.*;
 
public class SimpleTimeClient implements TimeClient {
 
    private LocalDateTime dateAndTime;
 
    public SimpleTimeClient() {
        dateAndTime = LocalDateTime.now();
    }
 
    public void setTime(int hour, int minute, int second) {
        LocalDate currentDate = LocalDate.from(dateAndTime);
        LocalTime timeToSet = LocalTime.of(hour, minute, second);
        dateAndTime = LocalDateTime.of(currentDate, timeToSet);
    }
 
    public void setDate(int day, int month, int year) {
        LocalDate dateToSet = LocalDate.of(day, month, year);
        LocalTime currentTime = LocalTime.from(dateAndTime);
        dateAndTime = LocalDateTime.of(dateToSet, currentTime);
    }
 
    public void setDateAndTime(int day, int month, int year,
                               int hour, int minute, int second) {
        LocalDate dateToSet = LocalDate.of(day, month, year);
        LocalTime timeToSet = LocalTime.of(hour, minute, second);
        dateAndTime = LocalDateTime.of(dateToSet, timeToSet);
    }
 
    public LocalDateTime getLocalDateTime() {
        return dateAndTime;
    }
 
    public String toString() {
        return dateAndTime.toString();
    }
 
    public static void main(String… args) {
        TimeClient myTimeClient = new SimpleTimeClient();
        System.out.println(myTimeClient.toString());
    }
}
现在假设你想在接口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();                           
 ZonedDateTime getZonedDateTime(String zoneString); }
随着TimeClient的变化,你不得不修改你的SimpleTimeClient类,实现getZonedDateTime方法。一般来说,设置时区这个功能会是各个TimeClient实现类中通用的一个功能。这个时候,你通常会选择再定义一个AbstractTimeClient类来实现getZonedDateTime方法。而在JDK8中,你可以选择直接在接口中来实现该方法(interface已经把手伸到abstract class的地盘了)。
 
package defaultmethods;
 
import java.time.*;
 
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));
    }
}
从上面的例子,我们可以看到通过static和default修饰符我们可以直接在接口中实现方法体,同时不要忘记,任何在接口中方法声明都是public类型的哦。
 
OK,现在我们需要一个新的接口:AnotherTimeClient,它得继承TimeClient接口。那么,对于TimeClient接口中定义的getZonedDateTime方法,你可以做如下三种处理:
 
重新声明getZonedDateTime方法,使它变成abstract类型。
重新定义getZonedDateTime方法。
直接继承。
而static方法和我们在类里面定义的static方法概念一致。

教你在Java接口中定义方法详解编程语言

转载请注明来源网站:blog.ytso.com谢谢!

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/14894.html

(0)
上一篇 2021年7月19日 17:12
下一篇 2021年7月19日 17:12

相关推荐

发表回复

登录后才能评论