Java 9 私有接口方法

在 Java 8之前,接口可以有常量变量和抽象方法。

我们不能在接口中提供方法实现。如果我们要提供抽象方法和非抽象方法(方法与实现)的组合,那么我们就得使用抽象类。

实例

  1. public class Tester {
  2. public static void main(String []args) {
  3. LogOracle log = new LogOracle();
  4. log.logInfo("");
  5. log.logWarn("");
  6. log.logError("");
  7. log.logFatal("");
  8. LogMySql log1 = new LogMySql();
  9. log1.logInfo("");
  10. log1.logWarn("");
  11. log1.logError("");
  12. log1.logFatal("");
  13. }
  14. }
  15. final class LogOracle implements Logging {
  16. @Override
  17. public void logInfo(String message) {
  18. getConnection();
  19. System.out.println("Log Message : " + "INFO");
  20. closeConnection();
  21. }
  22. @Override
  23. public void logWarn(String message) {
  24. getConnection();
  25. System.out.println("Log Message : " + "WARN");
  26. closeConnection();
  27. }
  28. @Override
  29. public void logError(String message) {
  30. getConnection();
  31. System.out.println("Log Message : " + "ERROR");
  32. closeConnection();
  33. }
  34. @Override
  35. public void logFatal(String message) {
  36. getConnection();
  37. System.out.println("Log Message : " + "FATAL");
  38. closeConnection();
  39. }
  40. @Override
  41. public void getConnection() {
  42. System.out.println("Open Database connection");
  43. }
  44. @Override
  45. public void closeConnection() {
  46. System.out.println("Close Database connection");
  47. }
  48. }
  49. final class LogMySql implements Logging {
  50. @Override
  51. public void logInfo(String message) {
  52. getConnection();
  53. System.out.println("Log Message : " + "INFO");
  54. closeConnection();
  55. }
  56. @Override
  57. public void logWarn(String message) {
  58. getConnection();
  59. System.out.println("Log Message : " + "WARN");
  60. closeConnection();
  61. }
  62. @Override
  63. public void logError(String message) {
  64. getConnection();
  65. System.out.println("Log Message : " + "ERROR");
  66. closeConnection();
  67. }
  68. @Override
  69. public void logFatal(String message) {
  70. getConnection();
  71. System.out.println("Log Message : " + "FATAL");
  72. closeConnection();
  73. }
  74. @Override
  75. public void getConnection() {
  76. System.out.println("Open Database connection");
  77. }
  78. @Override
  79. public void closeConnection() {
  80. System.out.println("Close Database connection");
  81. }
  82. }
  83. interface Logging {
  84. String ORACLE = "Oracle_Database";
  85. String MYSQL = "MySql_Database";
  86. void logInfo(String message);
  87. void logWarn(String message);
  88. void logError(String message);
  89. void logFatal(String message);
  90. void getConnection();
  91. void closeConnection();
  92. }

以上实例执行输出结果为:

  1. Open Database connection
  2. Log Message : INFO
  3. Close Database connection
  4. Open Database connection
  5. Log Message : WARN
  6. Close Database connection
  7. Open Database connection
  8. Log Message : ERROR
  9. Close Database connection
  10. Open Database connection
  11. Log Message : FATAL
  12. Close Database connection

在上面的例子中,每个日志方法都有自己的实现。

在 Java 8 接口引入了一些新功能——默认方法和静态方法。我们可以在Java SE 8的接口中编写方法实现,仅仅需要使用 default 关键字来定义它们。

在 Java 8 中,一个接口中能定义如下几种变量/方法:

  • 常量
  • 抽象方法
  • 默认方法
  • 静态方法

实例

  1. public class Tester {
  2. public static void main(String []args) {
  3. LogOracle log = new LogOracle();
  4. log.logInfo("");
  5. log.logWarn("");
  6. log.logError("");
  7. log.logFatal("");
  8. LogMySql log1 = new LogMySql();
  9. log1.logInfo("");
  10. log1.logWarn("");
  11. log1.logError("");
  12. log1.logFatal("");
  13. }
  14. }
  15. final class LogOracle implements Logging {
  16. }
  17. final class LogMySql implements Logging {
  18. }
  19. interface Logging {
  20. String ORACLE = "Oracle_Database";
  21. String MYSQL = "MySql_Database";
  22. default void logInfo(String message) {
  23. getConnection();
  24. System.out.println("Log Message : " + "INFO");
  25. closeConnection();
  26. }
  27. default void logWarn(String message) {
  28. getConnection();
  29. System.out.println("Log Message : " + "WARN");
  30. closeConnection();
  31. }
  32. default void logError(String message) {
  33. getConnection();
  34. System.out.println("Log Message : " + "ERROR");
  35. closeConnection();
  36. }
  37. default void logFatal(String message) {
  38. getConnection();
  39. System.out.println("Log Message : " + "FATAL");
  40. closeConnection();
  41. }
  42. static void getConnection() {
  43. System.out.println("Open Database connection");
  44. }
  45. static void closeConnection() {
  46. System.out.println("Close Database connection");
  47. }
  48. }

以上实例执行输出结果为:

  1. Open Database connection
  2. Log Message : INFO
  3. Close Database connection
  4. Open Database connection
  5. Log Message : WARN
  6. Close Database connection
  7. Open Database connection
  8. Log Message : ERROR
  9. Close Database connection
  10. Open Database connection
  11. Log Message : FATAL
  12. Close Database connection

Java 9 不仅像 Java 8 一样支持接口默认方法,同时还支持私有方法。

在 Java 9 中,一个接口中能定义如下几种变量/方法:

  • 常量
  • 抽象方法
  • 默认方法
  • 静态方法
  • 私有方法
  • 私有静态方法

以下实例提取了冗余到通用方法,看起来明显更简洁:

实例

  1. public class Tester {
  2. public static void main(String []args) {
  3. LogOracle log = new LogOracle();
  4. log.logInfo("");
  5. log.logWarn("");
  6. log.logError("");
  7. log.logFatal("");
  8. LogMySql log1 = new LogMySql();
  9. log1.logInfo("");
  10. log1.logWarn("");
  11. log1.logError("");
  12. log1.logFatal("");
  13. }
  14. }
  15. final class LogOracle implements Logging {
  16. }
  17. final class LogMySql implements Logging {
  18. }
  19. interface Logging {
  20. String ORACLE = "Oracle_Database";
  21. String MYSQL = "MySql_Database";
  22. private void log(String message, String prefix) {
  23. getConnection();
  24. System.out.println("Log Message : " + prefix);
  25. closeConnection();
  26. }
  27. default void logInfo(String message) {
  28. log(message, "INFO");
  29. }
  30. default void logWarn(String message) {
  31. log(message, "WARN");
  32. }
  33. default void logError(String message) {
  34. log(message, "ERROR");
  35. }
  36. default void logFatal(String message) {
  37. log(message, "FATAL");
  38. }
  39. private static void getConnection() {
  40. System.out.println("Open Database connection");
  41. }
  42. private static void closeConnection() {
  43. System.out.println("Close Database connection");
  44. }
  45. }

以上实例执行输出结果为:

  1. Open Database connection
  2. Log Message : INFO
  3. Close Database connection
  4. Open Database connection
  5. Log Message : WARN
  6. Close Database connection
  7. Open Database connection
  8. Log Message : ERROR
  9. Close Database connection
  10. Open Database connection
  11. Log Message : FATAL
  12. Close Database connection