欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  技术分享

JDK8 Java接口开发实例_在接口中定义静态方法

程序员文章站 2022-03-01 12:53:26
...

基本上所有的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类型的哦

现在我们需要一个新的接口、AnotherTimeClient、它得继承TimeClient接口、那么、对于TimeClient接口中定义的getZonedDateTime方法、你可以做如下三种处理

1、重新声明getZonedDateTime方法、使它变成abstract类型

2、重新定义getZonedDateTime方法

3、直接继承TimeClient接口


这里使用的static方法和我们在类里面定义的static方法概念一致、都是可以直接通过类名直接调用的、在周一个应用程序里面只会有一份代码、且暂具一份内存