JDK8 Java接口开发实例_在接口中定义静态方法
2016-03-21 13:03:54  By: dwtedx

基本上所有的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方法概念一致、都是可以直接通过类名直接调用的、在周一个应用程序里面只会有一份代码、且暂具一份内存

若资源对你有帮助、浏览后有很大收获、不妨小额打赏我一下、你的鼓励是维持我不断写博客最大动力

想获取DD博客最新代码、你可以扫描下方的二维码、关注DD博客微信公众号(ddblogs)

或者你也可以关注我的新浪微博、了解DD博客的最新动态:DD博客官方微博(dwtedx的微博)

如对资源有任何疑问或觉得仍然有很大的改善空间、可以对该博文进行评论、希望不吝赐教

为保证及时回复、可以使用博客留言板给我留言: DD博客留言板(dwtedx的留言板)

感谢你的访问、祝你生活愉快、工作顺心、欢迎常来逛逛


猜你喜欢的

快速评论


技术评论

  • 该技术还没有评论、赶快抢沙发吧...
DD记账
top
+