为什么Java中继承是有害的二

2016-02-19 14:34 6 1 收藏

图老师设计创意栏目是一个分享最好最实用的教程的社区,我们拥有最用心的各种教程,今天就给大家分享为什么Java中继承是有害的二的教程,热爱PS的朋友们快点看过来吧!

【 tulaoshi.com - 编程语言 】

有一天,有人也许运行这个代码并且注重到Stack没有运行的如想象的那么快,并且能够在重负荷下使用。你能够重写Stack,以至于它不用ArrayList并且继续提高Stack的效率。!-- frame contents -- !-- /frame contents --这是新的倾向的和有意义的版本:

class Stack
{
private int stack_pointer = -1;
private Object[] stack = new Object[1000];

public void push( Object article )
{
assert stack_pointer stack.length;

stack[ ++stack_pointer ] = article;
}

public Object pop()
{
assert stack_pointer = 0;
return stack[ stack_pointer-- ];
}

public void push_many( Object[] articles )
{
assert ( stack_pointer + articles.length )



  注重到push_many不再多次调用push()—它做块传输。新的Stack运行正常;事实上,比前一个版本更好。不幸的是,派生类Monitorable_stack不再运行,因为假如push_many()被调用,它不正确的跟踪堆栈的使用(push()的派生类版本不再通过继续的push_many()方法调用,所以push_many()不再更新high_water_mark)。Stack是一个脆弱的类。与关闭它一样,事实上不可能通过小心来消灭这些类型的错误。

  注重假如你用接口继续,你就没有这个问题,因为你没有继续对你有害的函数。假如Stack是接口,由Simple_stack和Monitorable_stack实现,那么代码就是更加健壮的。

  我提供了一个基于接口的方法在Listing 0.1。这个解决方法和继续实现的方法一样的灵活:你能够用Stack抽象术语来写代码而不必担心你事实上在操作那种具体的堆栈。因为两个实现必须提供公共接口的所有东西,它很难使事情变糟。我仍然有和写基类的代码一样的只写一次,因为我用封装而不是继续。在底层,我不得不通过封装类中的琐碎的访问器方法来访问缺省的实现。(例如,Monitorable_Stack.push(…)(在41行)不得不调用在Simple_stack等价的方法).程序员埋怨写所有这些行,但是写这非凡行代码同消除重要的潜在bug是非常小的成本。

  Listing 0.1. 用接口消除脆弱基类

1  import Java.util.*;
2 
3  interface Stack
4  {
5  void push( Object o );
6  Object pop();
7  void push_many( Object[] source );
8  }
9 
10  class Simple_stack implements Stack
11  { private int stack_pointer = -1;
12  private Object[] stack = new Object[1000];
13 
14  public void push( Object o )
15  { assert stack_pointer stack.length;
16 
17  stack[ ++stack_pointer ] = o;
18  }
19 
20  public Object pop()
21  { assert stack_pointer = 0;
22 
23  return stack[ stack_pointer-- ];
24  }
25 
26  public void push_many( Object[] source )
27  { assert (stack_pointer + source.length) stack.length;
28 
29  System.arraycopy(source,0,stack,stack_pointer+1,
source.length);
30  stack_pointer += source.length;
31  }
32  }
33 
34 
35  class Monitorable_Stack implements Stack

来源:http://www.tulaoshi.com/n/20160219/1607239.html

延伸阅读
/**  * pTitle: 继承Thread,实现线程/p  * pDescription: 通过继承Thread类,实现其run方法,实现自己的线程/p  * pCopyright: Copyright (c) 2003/p  * pFilename: oneThread.java/p  * @version 1.0  */ public class oneThread extends Thread { /**  *br方法说明:构造器,本类没有使用  *br输入...
什么是遗嘱继承  关于遗嘱法律知识有很多,什么是遗嘱继承,遗嘱继承的情形有哪些?有人去世前会把自己一些财产想要继承给自己想要继承的人,对于遗嘱继承人也有一些相关的顺序,第一继承人是配偶、子女、父母。第二顺序是兄弟、姐妹、祖父母。对于相关遗嘱继承的相关法律知识图老师为大家分享了内容如,快来了解一下吧! 遗嘱继承是指...
标签: 电脑入门
中继器是局域网环境下用来延长网络距离的最简单最廉价的互联设备,操作在OSI的物理层,中继器对在线路上的信号具有放大再生的功能。 中继器(RP repeater)是连接网络线路的一种装置,常用于两个网络节点之间物理信号的双向转发工作。中继器是最简单的网络互联设备,主要完成物理层的功能,负责在两个节点的物理层上按位传递信息,完成信号的复...
哈士奇较温顺 哈士奇是一种古老犬种,原来在西伯利亚东北部、格陵兰南部生活。哈士奇名字的由来,是源自其独特的嘶哑声。进入家庭的哈士奇,性格变得十分温顺,成为比较知名的宠物狗。 哈士奇是现在大家都比较喜欢的一种雪橇犬,它们的长相有点像狼,因此很多人都比较怕这种狗狗。有些人还担心,哈士奇会不会像狼一样会咬人。其实只...
龙抬头是几月几日 龙抬头是我国的传统几日,是农历的二月初二,今年的龙抬头阳历是3月18日,是休息日星期天哦,其实在唐代农历二月初二就有了令节的性质了,在这天,很多人都会相约结伴去郊外踏青,顺便挖点野菜,实在是颇为有趣,具体情况如下: 2018年龙抬头是2018年3月18日,农历二月初二,星期日。 龙抬头节又称春龙节,是我国民间重...

经验教程

513

收藏

21
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部