a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 57|回复: 0

[其他] JAVU技巧:java中extends的危害(2)

[复制链接]
发表于 2012-8-4 12:28:23 | 显示全部楼层 |阅读模式
 有一天,有人也许运行这个代码而且注重到Stack没有运行的如想象的那么快,而且能够在重负荷下使用。你能够重写Stack,以至于它不用ArrayList而且继续提高Stack的效率。这是新的倾向的和有意义的版本:# X+ w0 t( D* ]9 z8 d9 W
  [/代码]
1 E8 J" L4 E* @/ R/ @5 V  class Stack
* _2 w& y  P" W' l7 o  {
, v0 X) k7 ^- O, r6 W; p  private int stack_pointer = -1;
4 M) \1 [, I9 x8 @) i  private Object[] stack = new Object[1000]; public void push( Object article )
( K9 v1 H& f  o4 l" Y3 S% w  {
3 p( \$ P2 J( F, |/ d2 _  assert stack_pointer < stack.length;
0 [1 m+ L+ D) X9 `  stack[ ++stack_pointer ] = article;- f$ A8 J) n( A: q& k
  }public Object pop()
& a) x8 i$ P  U5 d8 k. Y  {* O7 `. O+ i* V: [- b+ C) w
  assert stack_pointer >= 0;
& O9 m9 c- V2 B  return stack[ stack_pointer-- ];
1 n- h9 }% V2 b6 y3 s  } public void push_many( Object[] articles )
4 A* j4 u* x4 b- V9 x6 y* I0 l  {7 y  A5 L0 Q$ Z. S2 T
  assert ( stack_pointer + articles.length ) < stack.length; System.arraycopy( articles, 0, stack, stack_pointer + 1, articles.length );) l6 d9 z" y+ r% o3 M, ]
  Stack_pointer += articles.length;
! ]" ~/ W' D/ L' G+ ^& t- j  }- ]" V! z4 U: E8 g, c" G$ c. D
  }
" n# u2 ^6 O% T3 `/ d; z  [/代码]注重到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长短常小的成本。[/代码]
$ @; X3 S% `# }% m9 T9 Z$ b9 z  Listing 0.1. 用接口消弭懦弱基类 1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-6 00:15 , Processed in 0.374280 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表