作者PsMonkey (痞子军团团长)
看板java
标题[翻译] 简介 Java 8 的 default method
时间Wed Mar 27 18:07:15 2013
※ [本文转录自 Translate-CS 看板 #1HKiJ054 ]
作者: PsMonkey (痞子军团团长) 看板: Translate-CS
标题: [翻译] 简介 Java 8 的 default method
时间: Wed Mar 27 18:06:51 2013
原文网址:
http://www.javacodegeeks.com/2013/03/
introduction-to-default-methods-defender-methods-in-java-8.html
译文网址:
http://blog.dontcareabout.us/2013/03/java-8-default-method.html
BBS 版以 markdown 撰写
______________________________________________________________________
我们都知道 Java 里头的 interface 仅包含 method 的宣告、并没有实作的部份,
任何 implement interface 但又不是 abstract class 的 class
必须提供这些 method 实作。
看看下面这个例子:
public interface SimpleInterface {
public void doSomeWork();
}
class SimpleInterfaceImpl implements SimpleInterface{
@Override
public void doSomeWork() {
System.out.println("Do Some Work implementation in the class");
}
public static void main(String[] args) {
SimpleInterfaceImpl simpObj = new SimpleInterfaceImpl();
simpObj.doSomeWork();
}
}
如果在 `SimpleInterface` 里头加一个新的 method 会怎样?
public interface SimpleInterface {
public void doSomeWork();
public void doSomeOtherWork();
}
在尝试 compile 的时候会得到这个结果:
$javac .\SimpleInterface.java
.\SimpleInterface.java:18: error: SimpleInterfaceImpl is not abstract and does not
override abstract method doSomeOtherWork() in SimpleInterface
class SimpleInterfaceImpl implements SimpleInterface{
^
1 error
这个限制导致要拓展、加强既有的 interface 跟 API 简直难上加难。
在补强 Java 8 的 Collection API 以支援 lambda expression 时也遇到同样困扰。
为了解决这个限制,Java 8 导入一个称为 default method 的新观念,
也有人称之为 defender method 或 virtual extension method。
default method 会有预设的实作内容,
将有助於在不影响既有程式码的前提下改善 interface。
看看这个例子就了解了:
public interface SimpleInterface {
public void doSomeWork();
//interface 中的 default method 要用「default」这个关键字
default public void doSomeOtherWork(){
System.out.println(
"DoSomeOtherWork implementation in the interface"
);
}
}
class SimpleInterfaceImpl implements SimpleInterface{
@Override
public void doSomeWork() {
System.out.println("Do Some Work implementation in the class");
}
/*
* 不需要提供 doSomeOtherWork 的实作了
*/
public static void main(String[] args) {
SimpleInterfaceImpl simpObj = new SimpleInterfaceImpl();
simpObj.doSomeWork();
simpObj.doSomeOtherWork();
}
}
输出结果会是:
Do Some Work implementation in the class
DoSomeOtherWork implementation in the interface
这里很简短地介绍了 default,想要更深入了解的可以参考[这份文件]。
[这份文件]:
http://cr.openjdk.java.net/~briangoetz/
lambda/Defender%20Methods%20v4.pdf
--
钱锺书:
说出来的话
http://www.psmonkey.org
比不上不说出来的话
Java 版 cookcomic 版
只影射着说不出来的话
and more......
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.25.4.190
※ 发信站: 批踢踢实业坊(ptt.cc)
※ 转录者: PsMonkey (114.25.4.190), 时间: 03/27/2013 18:07:15
1F:推 chunhsiang:感谢 JAVA又有新东西啦~ 03/27 20:15
2F:→ fireslayer:这感觉有点像C++的vtable 03/27 23:13
3F:推 AI3767:这样interface多重继承不会有问题吗@@? 03/28 00:52
4F:→ cha122977:这样搞的话以後都不用写Abstract Basic Class了... 03/28 02:36
5F:推 abola921:感觉就是把abstract 的工作抢去interface做了.. 03/29 17:01
6F:推 abola921:不过default function应该不能被super,又有点差异跟限制 03/29 17:42
7F:推 pzyc79:Default Method会盖过同名的Class Method这样不会出问题吗? 03/29 20:23
8F:→ coolcomm:如果有ambiguity应该会在编译时期挡下吧 我猜 03/29 22:05
9F:推 syamp:把interface改到这麽鸟, 不如直接让class支援多重继承 03/30 10:53
10F:→ adrianshum:其实这和 multi inheritence 还有什麽分别? 03/30 11:42
11F:→ coolcomm:多重继承在重载的时候会有ambiguity的问题 03/30 13:04
12F:推 coolcomm:不过rich interface好像也有喔...XD 03/30 13:08
13F:推 syamp:楼上大大说得好。既然两者都有同样问题,何不直接放宽class 03/30 15:39
14F:→ adrianshum:楼上:该是指 override 吧。overloading与多重继承关系 03/30 15:39
15F:→ adrianshum:不大。当初 Java 就是说只支援单继承因为多重继承有很 03/30 15:40
16F:→ adrianshum:多麻烦,现在大概只少了 virtual inheritence 的麻烦, 03/30 15:40
17F:→ adrianshum:其他的多重继承的麻烦大概都齐备了 orz 03/30 15:41
18F:→ syamp:的限制,直接drepecate掉interface, 也剩得记那堆keywords 03/30 15:44
19F:推 syamp:楼上A大,设计上的麻烦让compiler去挡你觉得怎样? 03/30 15:54
20F:→ adrianshum:C++ 一样是 compiler 会挡哦,不挡的话就不止是麻烦了XD 03/30 15:58
21F:推 syamp:是哦,像这样把interface搞得四不像我还觉得更麻烦咧。 03/30 16:04
22F:推 Darkword1987:这跟abstract class有什麽差别...除了可以多继承 03/30 18:40
23F:推 pzyc79:抽象类别可以定义属性介面不行 所以DM只能实作抽象方法 03/30 18:55
24F:推 abola921:我去抓了early的jdk8来试default method还没实装 04/01 09:48