zoukankan      html  css  js  c++  java
  • 教你在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方法,你可以做如下三种处理:

    1. 重新声明getZonedDateTime方法,使它变成abstract类型。
    2. 重新定义getZonedDateTime方法。
    3. 直接继承。

    而static方法和我们在类里面定义的static方法概念一致。

  • 相关阅读:
    大数据学习之路(持续更新中...)
    大数据之Yarn——Capacity调度器概念以及配置
    大数据之Oozie——源码分析(一)程序入口
    《结网》—— 读后总结
    [大数据之Yarn]——资源调度浅学
    Java程序员的日常—— FileUtils工具类的使用
    Oracle 11g透明网关连接Sqlserver 2000
    Python3中通过fake_useragent生成随机UserAgent
    Python导入 from lxml import etree 导入不了
    ModuleNotFoundError: No module named 'pymysql'
  • 原文地址:https://www.cnblogs.com/kaiblog/p/5295873.html
Copyright © 2011-2022 走看看