ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>
ä¸ÞZ»€ä¹ˆé‡æž?
釿ž„æ˜¯æŒ‡åœ¨ä¸æ”¹å˜½E‹åºåŠŸèƒ½çš„å‰æä¸‹æ”¹å˜å…¶ç»“æž„ã€‚é‡æž„是一™å¹åŠŸèƒ½å¼ºå¤§çš„æŠ€æœ¯ï¼Œä½†æ˜¯æ‰§è¡Œèµäh¥éœ€è¦å€åŠ ž®å¿ƒæ‰è¡Œã€‚主è¦çš„å±é™©åœ¨äºŽå¯èƒ½åœ¨ä¸¾læ„ä¸å¼•入一些错误,ž®¤å…¶æ˜¯åœ¨˜q›è¡Œæ‰‹å·¥é‡æž„的时候更是如æ¤ã€‚è¿™¿Uå±é™©å¼•å‘了寚w‡æž„æŠ€æœ¯çš„æ™®éæ‰¹è¯„åQšå½“代ç ä¸ä¼šå´©æºƒçš„æ—¶å€™äؓ什么è¦ä¿®æ”¹å®ƒå‘¢åQ?
您需è¦è¿›è¡Œä»£ç 釿ž„çš„åŽŸå› å¯èƒ½æœ‰ä»¥ä¸‹å‡ ä¸ªï¼šä¼ è¯´ä¸çš„½W¬ä¸€ä¸ªåŽŸå› æ˜¯åQšéœ€è¦ç‘ôæ‰¿äØ“æŸä¸ªå¤è€äñ”å“而开å‘çš„òq´ä»£ä¹…远的代ç ,或者çªç„¶ç¢°åˆ°è¿™äº›ä»£ç 。最åˆçš„å¼€å‘团队已¾lä¸åœ¨äº†ã€‚我们必™åÕdˆ›å»ºå¢žåŠ äº†æ–°ç‰¹æ€§çš„æ–°ç‰ˆæœ¬èÊYä»Óž¼Œä½†æ˜¯˜q™äº›ä»£ç å·²ç»æ— 法ç†è§£äº†ã€‚新的开å‘队ä¼å¤œä»¥ç‘ô日地工作åQŒç ´è¯‘代ç ç„¶åŽæ˜ ž®„代ç ,¾l过大é‡çš„规划与设计之åŽåQŒäh们将˜q™äº›ä»£ç 分割æˆç¢Žç‰‡ã€‚历¾lé‡é‡ç£¨éš¾ä¹‹åŽï¼Œæ‰€æœ‰è¿™äº›ä¸œè¥‰Kƒ½æŒ‰ç…§æ–°ç‰ˆæœ¬çš„è¦æ±‚å½’ä½äº†ã€‚è¿™æ˜¯è‹±é›„èˆ¬çš„é‡æž„æ•…äº‹ï¼Œå‡ ä¹Žæ²¡æœ‰äºø™ƒ½åœ¨ç»åŽ†äº†˜q™äº›ä¹‹åŽ‹zȀ讲述˜q™æ ·çš„æ•…事ã€?/p>
˜q˜æœ‰ä¸€¿U现实一些的情况是项目ä¸åŠ å…¥äº†æ–°çš„éœ€æ±‚ï¼Œéœ€è¦å¯¹è®¾è®¡˜q›è¡Œä¿®æ”¹ã€‚è‡³äºŽæ˜¯å› äØ“åœ¨æœ€åˆçš„规划˜q‡ç¨‹ä¸å¤±å¯Ÿï¼Œ˜q˜æ˜¯ç”׃ºŽé‡‡ç”¨äº†è„P代å¼çš„å¼€å‘过½E‹ï¼ˆæ¯”å¦‚æ•æ·å¼€å‘,或者是‹¹‹è¯•驱动的开å‘)而在开å‘过½E‹ä¸æœ‰æ„引入需求,˜q™ä¸¤è€…åÆˆæ²¡æœ‰å®žè´¨æ€§çš„åŒºåˆ«ã€‚è¿™æ ïLš„釿ž„的规模覞®å¾—多,其内容一般涉åŠé€šè¿‡å¼•å…¥æŽ¥å£æˆ–è€…æŠ½è±¡ç±»æ¥æ›´æ”¹ç±»çš„ç‘ô承关¾p»ï¼Œä»¥åŠå¯¹ç±»˜q›è¡Œåˆ†å‰²å’Œé‡æ–°ç»„¾l‡ï¼Œ½{‰ç‰ã€?/p>
釿ž„的最åŽä¸€ä¸ªåŽŸå› æ˜¯åQŒå½“å˜åœ¨å¯ç”¨çš„è‡ªåŠ¨é‡æž„å·¥å…äh—¶åQŒå¯ä»¥æœ‰ä¸€ä¸ªç”¨æ¥é¢„先生æˆä»£ç çš„å¿«æ·æ–¹å¼——ž®±å¥½æ¯”åœ¨æ‚¨æ— æ³•ç¡®å®šå¦‚ä½•æ‹¼å†™æŸä¸ªå•è¯çš„æ—¶å€™ï¼Œå¯ä»¥ç”¨æŸ¿U拼写检查工兯‚¾“入这个å•è¯ã€‚比如说åQŒæ‚¨å¯ä»¥ç”¨è¿™¿Uåã^æ·¡æ— å¥‡çš„é‡æž„æ–ÒŽ³•ç”Ÿæˆ getter å’?setter æ–ÒŽ³•åQŒä¸€æ—¦ç†Ÿæ‚‰äº†˜q™æ ·çš„工典P¼Œå®ƒå°±å¯ä»¥ä¸ºæ‚¨èŠ‚çœå¾ˆå¤šçš„æ—¶é—´ã€?/p>
Eclipse çš„é‡æž„å·¥å…äh— æ„进行英雄çñ”çš„é‡æž?#8212;—适刘q™ç§è§„æ¨¡çš„å·¥å…·å‡ ä¹Žæ²¡æœ?#8212;—但是ä¸è®ºæ˜¯å¦ç”¨åˆ°æ•æ·å¼€å‘技术,Eclipse 的工具对于一般程åºå‘˜ä¿®æ”¹ä»£ç 的工作都å…ähœ‰æ— 法衡é‡çš„äh倹{€‚毕竟ä“Q何夿‚çš„æ“作åªè¦èƒ½å¤Ÿè‡ªåЍ˜q›è¡ŒåQŒå°±å¯ä»¥ä¸é‚£ä¹ˆçƒ¦é—·äº†ã€‚åªè¦æ‚¨çŸ¥é“ Eclipse å®žçŽ°äº†ä»€ä¹ˆæ ·çš„é‡æž„工典P¼Œòq¶ç†è§£äº†å®ƒä»¬çš„适用情况åQŒæ‚¨çš„生产力ž®×ƒ¼šå¾—到æžå¤§çš„æé«˜ã€?/p>
è¦é™ä½Žå¯¹ä»£ç é€ æˆç ´å的风险,有两¿Ué‡è¦çš„æ–ÒŽ³•。第一¿U方法是对代ç 进行一套完全彻底的å•å…ƒ‹¹‹è¯•åQšåœ¨é‡æž„之å‰å’Œä¹‹åŽéƒ½å¿…须通过˜q™æ ·çš„æµ‹è¯•ã€‚ç¬¬äºŒç§æ–ÒŽ³•是ä‹É用自动化的工å…äh¥˜q›è¡Œé‡æž„åQŒæ¯”如说 Eclipse çš„é‡æž„特性ã€?/p>
ž®†å½»åº•çš„‹¹‹è¯•ä¸Žè‡ªåŠ¨åŒ–é‡æž„¾l“åˆèµäh¥ž®×ƒ¼šæ›´åŠ æœ‰æ•ˆäº†ï¼Œ˜q™æ ·é‡æž„也就从一¿U神¿U˜çš„è‰ºæœ¯å˜æˆäº†æœ‰ç”¨çš„æ—¥å¸¸å·¥å…·ã€‚äØ“äº†å¢žåŠ æ–°çš„åŠŸèƒ½æˆ–è€…æ”¹˜q›ä»£ç çš„å¯ç»´æŠ¤æ€§ï¼Œæˆ‘们å¯ä»¥åœ¨ä¸å½±å“原有代ç 功能的基¼‹€ä¸Šè¿…速且安全地改å˜å…¶¾l“构。这¿U能力会å¯ÒŽ‚¨è®¾è®¡å’Œå¼€å‘代ç 的方å¼äº§ç”Ÿæžå¤§çš„媄å“,å³ä¾¿æ˜¯æ‚¨æ²¡æœ‰ž®†å…¶¾l“åˆåˆ°æ£å¼çš„æ•æ·æ–ÒŽ³•ä¸ä¹Ÿæ²¡æœ‰å…³ç³»ã€?/p>
Eclipse çš„é‡æž„工具å¯ä»¥åˆ†ä¸ÞZ¸‰å¤§ç±»åQˆä¸‹é¢çš„™åºåºä¹Ÿå°±æ˜¯è¿™äº›å·¥å…·åœ¨ Refactoring èœå•ä¸å‡ºçŽ°çš„™åºåºåQ‰ï¼š
˜q˜æœ‰å‡ ä¸ªé‡æž„工具òq¶ä¸èƒ½å®Œå…¨å½’入这三个¿Uç±»åQŒç‰¹åˆ«æ˜¯ Change Method SignatureåQŒä¸˜q‡åœ¨æœ¬æ–‡ä¸è¿˜æ˜¯å°†˜q™ä¸ªå·¥å…·å½’å…¥½W¬ä¸‰¾c…R€‚除了这¿U例外情况以外,本文下é¢å‡ 节都是按照上é¢çš„é¡ºåºæ¥è®¨è®º Eclipse 釿ž„工具的ã€?/p>
昄¡„¶åQŒæ‚¨å³ä¾¿æ²¡æœ‰ç‰¹åˆ«çš„工典P¼Œä¹Ÿå¯ä»¥åœ¨æ–‡äšg¾pÈ»Ÿä¸é‡å‘½åæ–‡äšg或者是¿UÕdŠ¨æ–‡äšgåQŒä½†æ˜¯å¦‚æžœæ“作对象是 Java æºä»£ç æ–‡ä»Óž¼Œæ‚¨å°±éœ€è¦ç¼–辑很多文ä»Óž¼Œæ›´æ–°å…¶ä¸çš?import
�package
è¯å¥ã€‚与æ¤ç±»ä¼û|¼Œç”¨æŸ¿U文本编辑器的æœç´¢ä¸Žæ›¿æ¢åŠŸèƒ½ä¹Ÿå¯ä»¥å¾ˆå®ÒŽ˜“地给¾c…R€æ–¹æ³•å’Œå˜é‡é‡æ–°å‘½ååQŒä½†æ˜¯è¿™æ ·åšçš„æ—¶å€™å¿…™åÕd分å°å¿ƒï¼Œå› 䨓ä¸åŒçš„ç±»å¯èƒ½å…ähœ‰åç§°ç›æ€¼¼çš„æ–¹æ³•或者å˜é‡ï¼›è¦æ˜¯ä»Žå¤´åˆ°å°¾‹‚€æŸ¥é¡¹ç›®ä¸æ‰€æœ‰çš„æ–‡äšgåQŒæ¥ä¿è¯æ¯ä¸ªä¸œè¥¿çš„æ ‡è¯†å’Œä¿®æ”¹çš„æ£¼‹®æ€§ï¼Œé‚£å¯çœŸå¤Ÿä¹å‘³çš„ã€?
Eclipse çš?Rename å’?Move 工具能够ååˆ†èªæ˜Žåœ°åœ¨æ•´ä¸ª™å¹ç›®ä¸å®Œæˆè¿™æ ïLš„修改åQŒè€Œä¸éœ€è¦ç”¨æˆïLš„òq²æ¶‰ã€‚è¿™æ˜¯å› ä¸?Eclipse å¯ä»¥ç†è§£ä»£ç çš„è¯ä¹‰ï¼Œä»Žè€Œèƒ½å¤Ÿè¯†åˆ«å‡ºå¯ÒŽŸä¸ªç‰¹å®šæ–¹æ³•ã€å˜é‡æˆ–者类å称的引用。简化这一ä»ÕdŠ¡æœ‰åŠ©äºŽç¡®ä¿æ–¹æ³•ã€å˜é‡å’Œ¾cÈš„å称能够清晰地指½Cºå…¶ç”¨é€”ã€?/p>
我们¾l常å¯ä»¥å‘现代ç çš„åå—䏿°å½“或者ä×o人容易误解,˜q™æ˜¯å› 䨓代ç 与最åˆè®¾è®¡çš„功能有所ä¸åŒã€‚比方说åQŒæŸä¸ªç”¨æ¥åœ¨æ–‡äšg䏿Ÿ¥æ‰„¡‰¹å®šå•è¯çš„½E‹åºä¹Ÿè®¸ä¼šæ‰©å±•䨓åœ?Web ™åµé¢ä¸é€šè¿‡ URL èŽ·å– InputStream
çš„æ“作。如果这一输入‹¹æœ€åˆå«å?file
åQŒé‚£ä¹ˆå°±åº”该修改它的åå—åQŒä»¥ä¾¿èƒ½åæ˜ å…¶æ–°å¢žçš„æ›´åŠ ä¸€èˆ¬çš„ç‰ÒŽ€§ï¼Œæ¯”æ–¹è¯?sourceStream
。开å‘äh员ç»å¸¸æ— 法æˆåŠŸåœ°ä¿®æ”¹˜q™äº›åç§°åQŒå› 䏸™¿™ä¸ªè¿‡½E‹æ˜¯ååˆ†æ··äØ•å’Œä¹å‘³çš„。这当然也会把下一个ä¸å¾—ä¸å¯¹è¿™äº›ç±»˜q›è¡Œæ“作的开å‘äh员弄¾pŠæ¶‚ã€?
è¦å¯¹æŸä¸ª Java å…ƒç´ ˜q›è¡Œé‡å‘½å,åªéœ€è¦ç®€å•地ä»?Package Explorer 视图ä¸ç‚¹å‡»è¿™ä¸ªå…ƒç´ ,或者从Java æºä»£ç 文件ä¸é€‰ä¸˜q™ä¸ªå…ƒç´ åQŒç„¶åŽé€‰æ‹©èœå•™å?Refactor > Renameã€‚åœ¨å¯¹è¯æ¡†ä¸è¾“入新的åç§°åQŒç„¶åŽé€‰æ‹©æ˜¯å¦éœ€è¦?Eclipse 也改å˜å¯¹˜q™ä¸ªå称的引用。实际显½Cºå‡ºæ¥çš„¼‹®åˆ‡å†…å®¹ä¸Žæ‚¨æ‰€é€‰å…ƒç´ çš„¾cÕdž‹æœ‰å…³ã€‚比方说åQŒå¦‚果选择的属性具æœ?getter å’?setter æ–ÒŽ³•åQŒé‚£ä¹ˆä¹Ÿž®±å¯ä»¥åŒæ—¶æ›´æ–°è¿™äº›æ–¹æ³•çš„åç§°åQŒä»¥åæ˜ æ–°çš„å±žæ€§ã€‚å›¾1昄¡¤ºäº†ä¸€ä¸ªç®€å•的例åã€?
å›?1. é‡å‘½å一个局部å˜é‡?/strong>
ž®±åƒæ‰€æœ‰çš„ Eclipse 釿ž„æ“ä½œä¸€æ øP¼Œå½“æ‚¨æŒ‡å®šäº†å…¨éƒ¨ç”¨æ¥æ‰§è¡Œé‡æž„的必è¦ä¿¡æ¯ä¹‹åŽåQŒæ‚¨ž®±å¯ä»¥ç‚¹å‡?Preview 按钮åQŒç„¶åŽåœ¨ä¸€ä¸ªå¯¹è¯æ¡†ä¸å¯¹æ¯?Eclipse 打算˜q›è¡Œå“ªäº›å˜æ›´åQŒæ‚¨å¯ä»¥åˆ†åˆ«å¦å†³æˆ–者确认æ¯ä¸€ä¸ªå—到媄å“的文äšgä¸çš„æ¯ä¸€™å¹å˜æ›´ã€‚如果您对于 Eclipse æ£ç¡®æ‰§è¡Œå˜æ›´çš„能力有信心的è¯åQŒæ‚¨å¯ä»¥åªæŒ‰ä¸?OK按钮。显ç„Óž¼Œå¦‚果您丼‹®å®šé‡æž„到底åšäº†ä»€ä¹ˆäº‹æƒ…,您就会想先预览一下,但是对于 Rename å’?Move ˜q™æ ·½Ž€å•çš„é‡æž„而言åQŒé€šå¸¸æ²¡æœ‰å¿…è¦é¢„览ã€?
Move æ“作ä¸?Rename ååˆ†ç›æ€¼¼åQšæ‚¨é€‰æ‹©æŸä¸ª Java å…ƒç´ åQˆé€šå¸¸æ˜¯ä¸€ä¸ªç±»åQ‰ï¼Œä¸ºå…¶æŒ‡å®šä¸€ä¸ªæ–°ä½ç½®åQŒåƈ定义是å¦éœ€è¦æ›´æ–°å¼•用。然åŽï¼Œæ‚¨å¯ä»¥é€‰æ‹© Preview‹‚€æŸ¥å˜æ›´æƒ…况,或者选择 OK ç«‹å³æ‰§è¡Œé‡æž„åQŒå¦‚å›?所½Cºã€?
å›?2. ž®†ç±»ä»Žä¸€ä¸ªåŒ…¿UÕdˆ°å¦ä¸€ä¸ªåŒ…
在æŸäº›åã^åîC¸ŠåQˆç‰¹åˆ«æ˜¯ WindowsåQ‰ï¼Œæ‚¨è¿˜å¯ä»¥åœ?Package Explorer 视图ä¸é€šè¿‡½Ž€å•拖攄¡š„æ–ÒŽ³•ž®†ç±»ä»Žä¸€ä¸ªåŒ…或者文件夹ä¸ç§»åˆ°å¦ä¸€ä¸ªåŒ…或文件夹ä¸ã€‚所有的引用都会自动更新ã€?/p>
Eclipse 䏿œ‰å¤§é‡çš„釿ž„工典P¼Œä½¿æ‚¨èƒ½å¤Ÿè‡ªåŠ¨æ”¹å˜¾cÈš„å…³ç³»ã€‚è¿™äº›é‡æž„å·¥å…·åÆˆæ²¡æœ‰ Eclipse æä¾›çš„其他工具那么常用,但是很有价å€û|¼Œå› äØ“å®ƒä»¬èƒ½å¤Ÿæ‰§è¡Œéžå¸¸å¤æ‚çš„ä“Q务。å¯ä»¥è¯´åQŒå½“它们用得上的时候,ž®×ƒ¼šéžå¸¸æœ‰ç”¨ã€?/p>
Convert Anonymous ClassåQˆè{æ¢åŒ¿åç±»åQ‰å’Œ Convert Nested TypeåQˆè{æ¢åµŒå¥—ç±»åQ‰è¿™ä¸¤ç§é‡æž„æ–ÒŽ³•æ¯”è¾ƒç›æ€¼¼åQŒå®ƒä»¬éƒ½ž®†æŸä¸ªç±»ä»Žå…¶å½“å‰èŒƒå›´¿UÕdŠ¨åˆ°åŒ…å«è¿™ä¸ªç±»çš„范围上ã€?/p>
匿å¾cÀL˜¯ä¸€¿Uè¯æ³•é€Ÿå†™æ ‡è®°åQŒä‹É您能够在需è¦å®žçްæŸä¸ªæŠ½è±¡ç±»æˆ–者接å£çš„地方创å¾ä¸€ä¸ªç±»çš„实例,而ä¸éœ€è¦æ˜¾å¼æä¾›ç±»çš„å¿U°ã€‚比如在创å¾ç”¨æˆ·ç•Œé¢ä¸çš„监å¬å™¨æ—¶åQŒå°±¾l常用到匿å¾c…R€‚在清å•1ä¸ï¼Œå‡è®¾ Bag 是在其他地方定义的一个接å£ï¼Œå…¶ä¸å£°æ˜Žäº†ä¸¤ä¸ªæ–¹æ³•, get()
å’?set()
�
public class BagExample { void processMessage(String msg) { Bag bag = new Bag() { Object o; public Object get() { return o; } public void set(Object o) { this.o = o; } }; bag.set(msg); MessagePipe pipe = new MessagePipe(); pipe.send(bag); } } |
当匿åç±»å˜å¾—很大åQŒå…¶ä¸çš„代ç 难以阅读的时候,您就应该考虑ž®†è¿™ä¸ªåŒ¿åç±»å˜æˆä¸¥æ ¼æ„义上的¾c»ï¼›ä¸ÞZº†ä¿æŒž®è£…性(æ¢å¥è¯è¯´åQŒå°±æ˜¯å°†å®ƒéšè—è“væ¥ï¼Œä½¿å¾—ä¸å¿…知é“它的外部¾cÖM¸çŸ¥é“它)åQŒæ‚¨åº”该ž®†å…¶å˜æˆåµŒå¥—¾c»ï¼Œè€Œä¸æ˜¯é¡¶¾U§ç±»ã€‚您å¯ä»¥åœ¨è¿™ä¸ªåŒ¿å类的内部点击,然åŽé€‰æ‹© Refactor > Convert Anonymous Class to Nested ž®±å¯ä»¥äº†ã€‚当出现¼‹®è®¤å¯¹è¯æ¡†çš„æ—¶å€™ï¼Œä¸ø™¿™ä¸ªç±»è¾“å…¥åç§°åQŒæ¯”å¦?BagImpl
åQŒç„¶åŽé€‰æ‹© Preview或è€?OKã€‚è¿™æ øP¼Œä»£ç ž®±å˜æˆäº†å¦‚清å?所½Cºçš„æƒ…åÅžã€?
public class BagExample { private final class BagImpl implements Bag { Object o; public Object get() { return o; } public void set(Object o) { this.o = o; } } void processMessage(String msg) { Bag bag = new BagImpl(); bag.set(msg); MessagePipe pipe = new MessagePipe(); pipe.send(bag); } } |
当您惌™®©å…¶ä»–的类使用æŸä¸ªåµŒå¥—¾cÀL—¶åQŒConvert Nested Type to Top Level ž®±å¾ˆæœ‰ç”¨äº†ã€‚比方说åQŒæ‚¨å¯ä»¥åœ¨ä¸€ä¸ªç±»ä¸ä‹É用值对象,ž®±åƒä¸Šé¢çš?BagImpl
¾c»é‚£æ —÷€‚å¦‚æžœæ‚¨åŽæ¥åˆå†³å®šåº”该在多个¾cÖM¹‹é—´å…±äº«è¿™ä¸ªæ•°æ®ï¼Œé‚£ä¹ˆé‡æž„æ“作ž®Þpƒ½ä»Žè¿™ä¸ªåµŒå¥—ç±»ä¸åˆ›å»ºæ–°çš„类文äšg。您å¯ä»¥åœ¨æºä»£ç æ–‡äšgä¸é«˜äº®é€‰ä¸¾cÕd¿UŽÍ¼ˆæˆ–者在 Outline 视图ä¸ç‚¹å‡È±»çš„å¿UŽÍ¼‰åQŒç„¶åŽé€‰æ‹© Refactor > Convert Nested Type to Top LevelåQŒè¿™æ ·å°±å®žçŽ°äº†é‡æž„ã€?
˜q™ç§é‡æž„è¦æ±‚æ‚¨äØ“è£…å…¥å®žä¾‹æä¾›ä¸€ä¸ªåå—ã€‚é‡æž„工具也会æä¾›å¾è®®çš„åç§°åQŒæ¯”å¦?example
åQŒæ‚¨å¯ä»¥æŽ¥å—˜q™ä¸ªåå—。这个åå—çš„æ„æ€è¿‡ä¸€ä¼šå„¿ž®±æ¸…楚了。点å‡?OK 之åŽåQŒå¤–层类 BagExample
ž®×ƒ¼šå˜æˆæ¸…å•3所½Cºçš„æ ·åã€?
public class BagExample { void processMessage(String msg) { Bag bag = new BagImpl(this); bag.set(msg); MessagePipe pipe = new MessagePipe(); pipe.send(bag); } } |
è¯äh³¨æ„,当一个类是嵌套类的时候,它å¯ä»¥è®¿é—®å…¶å¤–层¾cÈš„æˆå‘˜ã€‚äØ“äº†ä¿ç•™è¿™¿UåŠŸèƒ½ï¼Œé‡æž„˜q‡ç¨‹ž®†ä¸€ä¸ªè£…入类 BagExample 的实例放在å‰é¢é‚£ä¸ªåµŒå¥—ç±»ä¸ã€‚è¿™ž®±æ˜¯ä¹‹å‰è¦æ±‚您输入å¿U°çš„实例å˜é‡ã€‚åŒæ—¶ä¹Ÿåˆ›å¾äº†ç”¨äºŽè®¾¾|®è¿™ä¸ªå®žä¾‹å˜é‡çš„æž„é€ å‡½æ•°ã€‚é‡æž„过½E‹åˆ›å»ºçš„æ–°ç±» BagImpl 如清å?所½Cºã€?
final class BagImpl implements Bag { private final BagExample example; /** * @paramBagExample */ BagImpl(BagExample example) { this.example = example; // TODO Auto-generated constructor stub } Object o; public Object get() { return o; } public void set(Object o) { this.o = o; } } |
如果您的情况与这个例å相åŒï¼Œä¸éœ€è¦ä¿ç•™å¯¹ BagExample
的访问,您也å¯ä»¥å¾ˆå®‰å…¨åœ°åˆ 除˜q™ä¸ªå®žä¾‹å˜é‡ä¸Žæž„é€ å‡½æ•ŽÍ¼Œž®?BagExample
¾cÖM¸çš„ä»£ç æ”¹æˆç¼ºçœçš„æ— 傿•°æž„é€ å‡½æ•°ã€?
在类¾l§æ‰¿å…³ç³»å†…移动æˆå‘?/span>
˜q˜æœ‰ä¸¤ä¸ªé‡æž„工具åQŒPush Down å’?Pull UpåQŒåˆ†åˆ«å®žçް将¾cÀL–¹æ³•或者属性从一个类¿UÕdŠ¨åˆ°å…¶å类或父¾cÖM¸ã€‚å‡è®¾æ‚¨æœ‰ä¸€ä¸ªåä¸?Vehicle
的抽象类åQŒå…¶å®šä¹‰å¦‚清å?所½Cºã€?
public abstract class Vehicle { protected int passengers; protected String motor; public int getPassengers() { return passengers; } public void setPassengers(int i) { passengers = i; } public String getMotor() { return motor; } public void setMotor(String string) { motor = string; } } |
您还有一�Vehicle
çš„å¾c»ï¼Œ¾cÕdä¸?Automobile
åQŒå¦‚清å•6所½Cºã€?
public class Automobile extends Vehicle { private String make; private String model; public String getMake() { return make; } public String getModel() { return model; } public void setMake(String string) { make = string; } public void setModel(String string) { model = string; } } |
è¯äh³¨æ„, Vehicle
有一个属性是 motor
ã€‚å¦‚æžœæ‚¨çŸ¥é“æ‚¨å°†æ°¸è¿œåªå¤„ç†æ±½è½¦ï¼Œé‚£ä¹ˆ˜q™æ ·åšå°±å¥½äº†åQ›ä½†æ˜¯å¦‚果您也å…许出现划艇之¾cÈš„东西åQŒé‚£ä¹ˆæ‚¨ž®±éœ€è¦å°† motor
属性从 Vehicle
¾cÖM¸‹æ”‘Öˆ° Automobile
¾cÖM¸ã€‚䨓æ¤ï¼Œæ‚¨å¯ä»¥åœ¨ Outline 视图ä¸é€‰æ‹© motor
åQŒç„¶åŽé€‰æ‹© Refactor > Push Downã€?
Eclipse ˜q˜æ˜¯æŒø™ªæ˜Žçš„åQŒå®ƒçŸ¥é“您ä¸å¯èƒ½æ€ÀL˜¯å•å•¿UÕdЍæŸä¸ªå±žæ€§æœ¬íw«ï¼Œå› 椘q˜æä¾›äº† Add Required 按钮åQŒä¸˜q‡åœ¨ Eclipse 2.1 ä¸ï¼Œ˜q™ä¸ªåŠŸèƒ½òq¶ä¸æ€ÀL˜¯èƒ½æ£¼‹®åœ°å·¥ä½œã€‚您需è¦éªŒè¯ä¸€ä¸‹ï¼Œçœ‹æ‰€æœ‰ä¾èµ–于˜q™ä¸ªå±žæ€§çš„æ–ÒŽ³•是å¦éƒ½æŽ¨åˆîCº†ä¸‹ä¸€å±‚。在本例ä¸ï¼Œ˜q™æ ·çš„æ–¹æ³•有两个åQŒå³ä¸?motor
ç›æ€¼´çš?getter å’?setter æ–ÒŽ³•åQŒå¦‚å›?所½Cºã€?
å›?3. åŠ å…¥æ‰€éœ€çš„æˆå‘?/strong>
在按˜q?OK按钮之åŽåQ?motor
属性以å?getMotor()
å’?setMotor()
æ–ÒŽ³•ž®×ƒ¼š¿UÕdЍåˆ?Automobile
¾cÖM¸ã€‚清å?昄¡¤ºäº†åœ¨˜q›è¡Œäº†è¿™‹Æ¡é‡æž„之å?Automobile
¾cÈš„情åÅžã€?
public class Automobile extends Vehicle { private String make; private String model; protected String motor; public String getMake() { return make; } public String getModel() { return model; } public void setMake(String string) { make = string; } public void setModel(String string) { model = string; } public String getMotor() { return motor; } public void setMotor(String string) { motor = string; } } |
Pull Up 釿ž„ä¸?Push Down å‡ ä¹Žç›¸åŒåQŒå½“ç„?Pull Up 是将¾cÀLˆå‘˜ä»Žä¸€ä¸ªç±»ä¸ç§»åˆ°å…¶çˆ¶ç±»ä¸ï¼Œè€Œä¸æ˜¯å¾cÖM¸ã€‚如果您½EåŽæ”¹å˜ä¸ÀL„åQŒå†³å®šè¿˜æ˜¯æŠŠ motor
¿UÕd›žåˆ?Vehicle
¾cÖM¸åQŒé‚£ä¹ˆæ‚¨ä¹Ÿè®¸ž®×ƒ¼šç”¨åˆ°˜q™ç§é‡æž„ã€‚åŒæ ·éœ€è¦æé†’您åQŒä¸€å®šè¦¼‹®è®¤æ‚¨æ˜¯å¦é€‰æ‹©äº†æ‰€æœ‰å¿…需的æˆå‘˜ã€?
Automobile
¾cÖM¸å…ähœ‰æˆå‘˜ motoråQŒè¿™æ„å‘³ç€æ‚¨å¦‚果创建å¦ä¸€ä¸ªå¾c»ï¼Œæ¯”æ–¹è¯?Bus
åQŒæ‚¨ž®Þp¿˜éœ€è¦å°† motor
åQˆåŠå…¶ç›¸å…Ïx–¹æ³•ï¼‰åŠ å…¥åˆ?Bus
¾cÖM¸ã€‚有一¿U方法å¯ä»¥è¡¨½Cø™¿™¿Uå…³¾p»ï¼Œå›_ˆ›å»ÞZ¸€ä¸ªåä¸?Motorized
的接å£ï¼Œ Automobile
å’?Bus
都实现这个接å£ï¼Œä½†æ˜¯ RowBoat
ä¸å®žçްã€?
åˆ›å¾ Motorized
æŽ¥å£æœ€½Ž€å•çš„æ–ÒŽ³•是在 Automobile
上ä‹Éç”?Extract Interface 釿ž„ã€‚äØ“æ¤ï¼Œæ‚¨å¯ä»¥åœ¨ Outline 视图ä¸é€‰æ‹© Automobile
åQŒç„¶åŽä»Žèœå•ä¸é€‰æ‹© Refactor > Extract Interface。您å¯ä»¥åœ¨å¼¹å‡ºçš„å¯¹è¯æ¡†ä¸é€‰æ‹©æ‚¨å¸Œæœ›åœ¨æŽ¥å£ä¸åŒ…å«å“ªäº›æ–¹æ³•,如图4所½Cºã€?
点击 OK 之åŽåQŒæŽ¥å£å°±åˆ›å¾å¥½äº†åQŒå¦‚清å•8所½Cºã€?/p>
æ¸…å• 8. Motorized 接å£
public interface Motorized { public abstract String getMotor(); public abstract void setMotor(String string); } |
åŒæ—¶åQ?Automobile
çš„ç±»å£°æ˜Žä¹Ÿå˜æˆäº†ä¸‹é¢çš„æ ·å:
public class Automobile extends Vehicle implements Motorized |
æœ¬é‡æž„å·¥å…ïL±»åž‹ä¸æœ€åŽä¸€ä¸ªæ˜¯ User Supertyp Where Possible。想象一个用æ¥ç®¡ç†æ±½è½¦ç»†å¸çš„应用½E‹åºã€‚它自始至终都ä‹Éç”?Automobile
¾cÕdž‹çš„对象。如果您惛_¤„ç†æ‰€æœ‰ç±»åž‹çš„äº¤é€šå·¥å…øP¼Œé‚£ä¹ˆæ‚¨å°±å¯ä»¥ç”¨è¿™¿U釿ž„将所有对
Automobile
çš„å¼•ç”¨éƒ½å˜æˆå¯?Vehicle 的引用(å‚看å›?åQ‰ã€‚如果您在代ç ä¸ç”?instanceof
æ“作执行了ä“Q何类型检查的è¯ï¼Œæ‚¨å°†éœ€è¦å†³å®šåœ¨˜q™äº›åœ°æ–¹é€‚用的是原先的类˜q˜æ˜¯çˆ¶ç±»åQŒç„¶åŽé€‰ä¸½W¬ä¸€ä¸ªé€‰é¡¹“Use the selected supertype in 'instanceof' expressions”ã€?
å›?5. ž®?Automobile æ”ÒŽˆå…¶çˆ¶¾c?Vehicle
使用父类的需求在 Java è¯è¨€ä¸ç»å¸¸å‡ºçŽŽÍ¼Œç‰¹åˆ«æ˜¯åœ¨ä½¿ç”¨äº?Factory Method 模å¼çš„æƒ…况下。这¿U模å¼çš„å…¸åž‹å®žçŽ°æ–¹å¼æ˜¯åˆ›å»ÞZ¸€ä¸ªæŠ½è±¡ç±»åQŒå…¶ä¸å…·æœ‰é™æ€æ–¹æ³?create()
åQŒè¿™ä¸ªæ–¹æ³•返回的是实çŽîCº†˜q™ä¸ªæŠ½è±¡¾cÈš„一个具体对象。如果需创å¾çš„具体对象的¾cÕdž‹ä¾èµ–于实现的¾l†èŠ‚åQŒè€Œè°ƒç”¨ç±»å¯¹å®žçŽ°ç»†èŠ‚åÆˆä¸æ„Ÿå…´è¶£çš„æƒ…况下åQŒå¯ä»¥ä‹É用这一模å¼ã€?
最大一¾c»é‡æž„是实现了类内部代ç é‡ç»„çš„é‡æž„æ–¹æ³•ã€‚åœ¨æ‰€æœ‰çš„é‡æž„æ–ÒŽ³•ä¸ï¼Œåªæœ‰˜q™ç±»æ–ÒŽ³•å…许您引入或者移除ä¸é—´å˜é‡ï¼Œæ ÒŽ®åŽŸæœ‰æ–ÒŽ³•ä¸çš„部分代ç åˆ›å¾æ–°æ–¹æ³•,以åŠä¸ºå±žæ€§åˆ›å»?getter å’?setter æ–ÒŽ³•ã€?/p>
æœ‰ä¸€äº›é‡æž„方法是ä»?Extract ˜q™ä¸ªè¯å¼€å¤´çš„åQšExtract Methodã€Extract Local Variable 以åŠExtract Constants。第一ä¸?Extract Method çš„æ„æ€æ‚¨å¯èƒ½å·²ç»çŒœåˆ°äº†ï¼Œå®ƒæ ¹æ®æ‚¨é€‰ä¸çš„代ç 创建新的方法。我们以清å•8ä¸é‚£ä¸ªç±»çš?main()
æ–ÒŽ³•ä¸ÞZ¾‹ã€‚它首先å–得命ä×o行选项的å€û|¼Œå¦‚果有以 -D 开头的选项åQŒå°±ž®†å…¶ä»¥å-值对的åÅžå¼å˜å‚¨åœ¨ä¸€ä¸?Properties
对象ä¸ã€?
import java.util.Properties; import java.util.StringTokenizer; public class StartApp { public static void main(String[] args) { Properties props = new Properties(); for (int i= 0; i < args.length; i++) { if(args[i].startsWith("-D")) { String s = args[i].substring(2); StringTokenizer st = new StringTokenizer(s, "="); if(st.countTokens() == 2) { props.setProperty(st.nextToken(), st.nextToken()); } } } //continue... } } |
ž®†ä¸€éƒ¨åˆ†ä»£ç 从一个方法ä¸å–出òq¶æ”¾˜q›å¦ä¸€ä¸ªæ–¹æ³•ä¸çš„åŽŸå› ä¸»è¦æœ‰ä¸¤ç§ã€‚第一¿UåŽŸå› æ˜¯˜q™ä¸ªæ–ÒŽ³•太长åQŒåƈ且完æˆäº†ä¸¤ä¸ªä»¥ä¸Šé€»è¾‘上截然ä¸åŒçš„æ“ä½œã€‚ï¼ˆæˆ‘ä»¬ä¸çŸ¥é“上é¢é‚£ä¸?main()
æ–ÒŽ³•˜q˜è¦å¤„ç†å“ªäº›ä¸œè¥¿åQŒä½†æ˜¯ä»ŽçŽ°åœ¨æŽŒæ¡çš„è¯æ®æ¥çœ‹ï¼Œ˜q™ä¸æ˜¯ä»Žå…¶ä¸æå–å‡ÞZ¸€ä¸ªæ–¹æ³•çš„ç†ç”±ã€‚)å¦ä¸€¿UåŽŸå› æ˜¯æœ‰ä¸€ŒDµé€»è¾‘上清晰的代ç åQŒè¿™ŒDµä»£ç å¯ä»¥è¢«å…¶ä»–æ–ÒŽ³•é‡ç”¨ã€‚比方说在æŸäº›æ—¶å€™ï¼Œæ‚¨å‘现自己在很多ä¸åŒçš„æ–¹æ³•ä¸éƒ½é‡å¤ç¼–写了相åŒçš„å‡ è¡Œä»£ç 。那ž®±æœ‰å¯èƒ½æ˜¯éœ€è¦é‡æž„çš„åŽŸå› äº†ï¼Œä¸è¿‡é™¤éžçœŸçš„需è¦é‡ç”¨è¿™éƒ¨åˆ†ä»£ç åQŒå¦åˆ™æ‚¨å¾ˆå¯èƒ½åƈä¸ä¼šæ‰§è¡Œé‡æž„ã€?
å‡è®¾æ‚¨è¿˜éœ€è¦åœ¨å¦å¤–一个地方解æžå-值对åQŒåƈž®†å…¶æ”‘Öœ¨ Properties
对象ä¸ï¼Œé‚£ä¹ˆæ‚¨å¯ä»¥å°†åŒ…å« StringTokenizer
声明和下é¢çš„ if
è¯å¥çš„è¿™ŒDµä»£ç 抽å–出æ¥ã€‚䨓æ¤ï¼Œæ‚¨å¯ä»¥é«˜äº®é€‰ä¸˜q™æ®µä»£ç åQŒç„¶åŽä»Žèœå•ä¸é€‰æ‹© Refactor > Extract Method。您需è¦è¾“入方法å¿UŽÍ¼Œ˜q™é‡Œè¾“å…¥ addProperty
åQŒç„¶åŽéªŒè¯è¿™ä¸ªæ–¹æ³•çš„ä¸¤ä¸ªå‚æ•°åQ?Properties prop
å’?Strings
。清å?昄¡¤ºç”?Eclipse æå–äº?addProp()
æ–ÒŽ³•之厾cÈš„情况ã€?
import java.util.Properties; import java.util.StringTokenizer; public class Extract { public static void main(String[] args) { Properties props = new Properties(); for (int i = 0; i < args.length; i++) { if (args[i].startsWith("-D")) { String s = args[i].substring(2); addProp(props, s); } } } private static void addProp(Properties props, String s) { StringTokenizer st = new StringTokenizer(s, "="); if (st.countTokens() == 2) { props.setProperty(st.nextToken(), st.nextToken()); } } } |
Extract Local Variable 釿ž„å–出一ŒDµè¢«ç›´æŽ¥ä½¿ç”¨çš„表辑ּåQŒç„¶åŽå°†˜q™ä¸ªè¡¨è¾¾å¼é¦–先赋值给一个局部å˜é‡ã€‚ç„¶åŽåœ¨åŽŸå…ˆä½¿ç”¨é‚£ä¸ªè¡¨è¾¾å¼çš„地方使用˜q™ä¸ªå˜é‡ã€‚比方说åQŒåœ¨ä¸Šé¢çš„æ–¹æ³•ä¸åQŒæ‚¨å¯ä»¥é«˜äº®é€‰ä¸å¯?st.nextToken()
的第一‹Æ¡è°ƒç”¨ï¼Œç„¶åŽé€‰æ‹© Refactor > Extract Local Variable。您ž®†è¢«æç¤ºè¾“入一个å˜é‡å¿UŽÍ¼Œ˜q™é‡Œè¾“å…¥ key
。请注æ„åQŒè¿™é‡Œæœ‰ä¸€ä¸ªå°†è¢«é€‰ä¸è¡¨è¾¾å¼æ‰€æœ‰å‡ºçŽ°çš„åœ°æ–¹éƒ½æ›¿æ¢æˆæ–°å˜é‡çš„引用的选项。这个选项通常是适用的,但是对这里的 nextToken()
æ–ÒŽ³•ä¸é€‚用åQŒå› 䏸™¿™ä¸ªæ–¹æ³•(昄¡„¶åQ‰åœ¨æ¯ä¸€‹Æ¡è°ƒç”¨çš„æ—¶å€™éƒ½˜q”回ä¸åŒçš„倹{€‚确认这个选项未被选ä¸ã€‚å‚è§å›¾6ã€?
å›?6. ä¸å…¨éƒ¨æ›¿æ¢æ‰€é€‰çš„表达å¼?/strong>
接下æ¥ï¼Œåœ¨ç¬¬äºŒæ¬¡è°ƒç”¨ st.nextToken()
的地斚w‡å¤è¿›è¡Œé‡æž„,˜q™ä¸€‹Æ¡è°ƒç”¨çš„æ˜¯ä¸€ä¸ªæ–°çš„局部å˜é‡?value
。清å?0昄¡¤ºäº†è¿™ä¸¤æ¬¡é‡æž„之åŽä»£ç 的情形ã€?
private static void addProp(Properties props, String s) { StringTokenizer st = new StringTokenizer(s, "="); if(st.countTokens() == 2) { String key = st.nextToken(); String value = st.nextToken(); props.setProperty(key, value); } } |
用这¿Uæ–¹å¼å¼•å…¥å˜é‡æœ‰å‡ ç‚¹å¥½å¤„ã€‚é¦–å…ˆï¼Œé€šè¿‡ä¸ø™¡¨è¾‘Ö¼æä¾›æœ‰æ„义的åç§°åQŒå¯ä»¥ä‹Éå¾—ä»£ç æ‰§è¡Œçš„ä»ÕdŠ¡æ›´åŠ æ¸…æ™°ã€‚ç¬¬äºŒï¼Œä»£ç 调试å˜å¾—æ›´å®¹æ˜“ï¼Œå› äØ“æˆ‘ä»¬å¯ä»¥å¾ˆå®¹æ˜“地‹‚€æŸ¥è¡¨è¾‘Ö¼˜q”回的倹{€‚最åŽï¼Œåœ¨å¯ä»¥ç”¨ä¸€ä¸ªå˜é‡æ›¿æ¢åŒä¸€è¡¨è¾¾å¼çš„多个实例的情况下åQŒæ•ˆçއ将大大æé«˜ã€?/p>
Extract Constant ä¸?Extract Local Variable ç›æ€¼¼åQŒä½†æ˜¯æ‚¨å¿…é¡»é€‰æ‹©é™æ€å¸¸é‡è¡¨è¾‘Ö¼åQŒé‡æž„工具将会把它è{æ¢æˆé™æ€çš„ final 帔R‡ã€‚这在将¼‹¬ç¼–ç 的数å—和嗽W¦ä¸²ä»Žä»£ç ä¸åŽ»é™¤çš„æ—¶å€™éžå¸¸æœ‰ç”¨ã€‚比方说åQŒåœ¨ä¸Šé¢çš„代ç 䏿ˆ‘们ç”?#8220;-D”˜q™ä¸€å‘½ä×o行选项æ¥å®šä¹‰å-值对。先ž®?#8220;-D”高亮选ä¸åQŒé€‰æ‹© Refactor > Extract ConstantåQŒç„¶åŽè¾“å…?DEFINE ä½œäØ“å¸”R‡çš„å¿U°ã€‚釿ž„之åŽçš„代ç 如清å?1所½Cºï¼š
public class Extract { private static final String DEFINE = "-D"; public static void main(String[] args) { Properties props = new Properties(); for (int i = 0; i < args.length; i++) { if (args[i].startsWith(DEFINE)) { String s = args[i].substring(2); addProp(props, s); } } } // ... |
对于æ¯ä¸€¿U?Extract... ¾cÈš„釿ž„åQŒéƒ½å˜åœ¨å¯¹åº”çš?Inline... 釿ž„åQŒæ‰§è¡Œä¸Žä¹‹ç›¸åçš„æ“作。比方说åQŒå¦‚果您高亮选ä¸ä¸Šé¢ä»£ç ä¸çš„å˜é‡ såQŒé€‰æ‹© Refactor > Inline...åQŒç„¶åŽç‚¹å‡?OKåQŒEclipse ž®×ƒ¼šåœ¨è°ƒç”?addProp()
的时候直接ä‹Éç”?args[i].substring(2)
˜q™ä¸ªè¡¨è¾¾å¼ï¼Œå¦‚下所½Cºï¼š
if(args[i].startsWith(DEFINE)) { addProp(props,args[i].substring(2)); } |
˜q™æ ·æ¯”ä‹É用äÍæ—¶å˜é‡æ•ˆçŽ‡æ›´é«˜ï¼Œä»£ç 也å˜å¾—æ›´åŠ ç®€è¦ï¼Œè‡³äºŽ˜q™æ ·çš„ä»£ç æ˜¯æ˜“读˜q˜æ˜¯å«æØœåQŒå°±å–决于您的观点了。丘q‡ä¸€èˆ¬è¯´æ¥ï¼Œ˜q™æ ·çš„å†…åµŒé‡æž„没什么值得推è的地æ–V€?/p>
您å¯ä»¥æŒ‰ç…§ç”¨å†…åµŒè¡¨è¾¾å¼æ›¿æ¢å˜é‡çš„ç›¸åŒæ–ÒŽ³•åQŒé«˜äº®é€‰ä¸æ–ÒŽ³•åï¼Œæˆ–è€…é™æ€?final 帔R‡åQŒç„¶åŽä»Žèœå•ä¸é€‰æ‹© Refactor > Inline...åQŒEclipse ž®×ƒ¼šç”¨æ–¹æ³•çš„ä»£ç æ›¿æ¢æ–ÒŽ³•调用åQŒæˆ–者用帔R‡çš„值替æ¢å¯¹å¸”R‡çš„引用ã€?
é€šå¸¸æˆ‘ä»¬è®¤äØ“ž®†å¯¹è±¡çš„内部¾l“æž„æš´éœ²å‡ºæ¥æ˜¯ä¸€¿Uä¸å¥½çš„åšæ³•ã€‚è¿™ä¹Ÿæ£æ˜?Vehicle
¾cÕdŠå…¶å¾c»éƒ½å…ähœ‰ private 或è€?protected 属性,而用 public setter å’?getter æ–ÒŽ³•æ¥è®¿é—®å±žæ€§çš„åŽŸå› ã€‚è¿™äº›æ–¹æ³•å¯ä»¥ç”¨ä¸¤ç§ä¸åŒçš„æ–¹å¼è‡ªåŠ¨ç”Ÿæˆã€?
½W¬ä¸€¿U生æˆè¿™äº›æ–¹æ³•çš„æ–¹å¼æ˜¯ä‹Éç”?Source > Generate Getter and Setter èœå•。这ž®†ä¼šæ˜„¡¤ºä¸€ä¸ªå¯¹è¯æ¡†åQŒå…¶ä¸åŒ…嫿‰€æœ‰å°šæœªå˜åœ¨çš„ getter å’?setter æ–ÒŽ³•。丘q‡å› 䏸™¿™¿Uæ–¹å¼æ²¡æœ‰ç”¨æ–°æ–¹æ³•更新对˜q™äº›å±žæ€§çš„引用åQŒæ‰€ä»¥åƈä¸ç®—æ˜¯é‡æž„;必è¦çš„æ—¶å€™ï¼Œæ‚¨å¿…™å»è‡ªå·±å®Œæˆæ›´æ–°å¼•用的工作。这¿Uæ–¹å¼å¯ä»¥èŠ‚¾U¦å¾ˆå¤šæ—¶é—ß_¼Œä½†æ˜¯æœ€å¥½æ˜¯åœ¨ä¸€å¼€å§‹åˆ›å»ºç±»çš„æ—¶å€™ï¼Œæˆ–者是å‘ç±»ä¸åŠ å…¥æ–°å±žæ€§çš„æ—¶å€™ä‹Éç”¨ï¼Œå› äØ“˜q™äº›æ—¶å€™è¿˜ä¸å˜åœ¨å¯¹å±žæ€§çš„引用åQŒæ‰€ä»¥ä¸éœ€è¦å†ä¿®æ”¹å…¶ä»–代ç ã€?
½W¬äºŒ¿U生æˆ?getter å’?setter æ–ÒŽ³•çš„æ–¹å¼æ˜¯é€‰ä¸æŸä¸ªå±žæ€§ï¼Œç„¶åŽä»Žèœå•ä¸é€‰æ‹© Refactor > Encapsulate Field。这¿Uæ–¹å¼ä¸€‹Æ¡åªèƒ½äؓ一个属性生æˆ?getter å’?setter æ–ÒŽ³•åQŒä¸˜q‡å®ƒä¸?Source > Generate Getter and Setter 相ååQŒå¯ä»¥å°†å¯¹è¿™ä¸ªå±žæ€§çš„å¼•ç”¨æ”¹å˜æˆå¯¹æ–°æ–¹æ³•的调用ã€?
例如åQŒæˆ‘们å¯ä»¥å…ˆåˆ›å¾ä¸€ä¸ªæ–°çš„简ç‰?Automobile
¾c»ï¼Œå¦‚清å?2所½Cºã€?
public class Automobile extends Vehicle { public String make; public String model; } |
接下æ¥ï¼Œåˆ›å¾ä¸€ä¸ªç±»å®žä¾‹åŒ–了 Automobile
的类åQŒåƈ直接讉K—® make
属性,如清å?3所½Cºã€?
public class AutomobileTest { public void race() { Automobilecar1 = new Automobile(); car1.make= "Austin Healy"; car1.model= "Sprite"; // ... } } |
现在ž®è£… make
属性。先高亮选ä¸å±žæ€§å¿UŽÍ¼Œç„¶åŽé€‰æ‹© Refactor > Encapsulate Fieldã€‚åœ¨å¼¹å‡ºçš„å¯¹è¯æ¡†ä¸è¾“å…?getter å’?setter æ–ÒŽ³•çš„å¿U?#8212;—如您所料,¾~ºçœçš„æ–¹æ³•å¿U°åˆ†åˆ«æ˜¯ getMake() å’?setMake()。您也å¯ä»¥é€‰æ‹©ä¸Žè¿™ä¸ªå±žæ€§å¤„在åŒä¸€ä¸ªç±»ä¸çš„æ–ÒŽ³•是ç‘ô¾l直接访问该属性,˜q˜æ˜¯åƒå…¶ä»–ç±»é‚£æ ·æ”¹ç”¨˜q™äº›è®‰K—®æ–ÒŽ³•。(有一些ähéžå¸¸å€‘֑于ä‹Éç”¨è¿™ä¸¤ç§æ–¹å¼çš„æŸä¸€¿U,ä¸è¿‡¼„°åéy在这¿U情况下您选择哪一¿Uæ–¹å¼éƒ½æ²¡æœ‰åŒºåˆ«åQŒå› ä¸?Automobile
䏿²¡æœ‰å¯¹ make
属性的引用。)
点击 OK之åŽåQ?Automobile ¾cÖM¸çš?make
å±žæ€§å°±å˜æˆäº†ç§æœ‰å±žæ€§ï¼Œä¹ŸåŒæ—¶å…·æœ‰äº† getMake()
å’?setMake()
æ–ÒŽ³•ã€?
>
public class Automobile extends Vehicle { private String make; public String model; public void setMake(String make) { this.make = make; } public String getMake() { return make; } } |
AutomobileTest
¾cÖM¹Ÿè¦è¿›è¡Œæ›´æ–ŽÍ¼Œä»¥ä¾¿ä½¿ç”¨æ–°çš„讉K—®æ–ÒŽ³•åQŒå¦‚清å•15所½Cºã€?
public class AutomobileTest { public void race() { Automobilecar1 = new Automobile(); car1.setMake("Austin Healy"); car1.model= "Sprite"; // ... } } |
本文介ç»çš„æœ€åŽä¸€ä¸ªé‡æž„方法也是最难以使用的方法:Change Method SignatureåQˆæ”¹å˜æ–¹æ³•çš„½{‘ÖåQ‰ã€‚è¿™¿U方法的功能显而易è§?#8212;—æ”¹å˜æ–ÒŽ³•çš„å‚æ•°ã€å¯è§æ€§ä»¥åŠè¿”回值的¾cÕdž‹ã€‚而进行这æ ïLš„æ”¹å˜å¯¹äºŽè°ƒç”¨˜q™ä¸ªæ–ÒŽ³•的其他方法或者代ç 会产生什么媄å“,ž®×ƒ¸æ˜¯é‚£ä¹ˆæ˜¾è€Œæ˜“è§äº†ã€‚è¿™ä¹ˆä¹Ÿæ²¡æœ‰ä»€ä¹ˆé”æ–V€‚如果代ç 的改å˜åœ¨è¢«é‡æž„的方法内部引å‘了问题——å˜é‡æœªå®šä¹‰ï¼Œæˆ–者类型ä¸åŒšw…——釿ž„æ“作ž®†å¯¹˜q™äº›é—®é¢˜˜q›è¡Œæ ‡è®°ã€‚您å¯ä»¥é€‰æ‹©æ˜¯æŽ¥å—釿ž„,½EåŽæ”ÒŽ£˜q™äº›é—®é¢˜åQŒè¿˜æ˜¯å–æ¶ˆé‡æž„。如果这¿U釿ž„在其他的方法ä¸å¼•å‘问题åQŒå°±ç›´æŽ¥å¿½ç•¥˜q™äº›é—®é¢˜åQŒæ‚¨å¿…é¡»åœ¨é‡æž„之åŽäº²è‡ªä¿®æ”V€?/p>
为澄清这一点,考虑清å•16ä¸åˆ—出的¾cÕd’Œæ–ÒŽ³•ã€?/p>
æ¸…å• 16. MethodSigExample ¾c?/strong>
public class MethodSigExample { public int test(String s, int i) { int x = i + s.length(); return x; } } |
上题q™ä¸ª¾cÖM¸çš?test()
æ–ÒŽ³•被å¦ä¸€ä¸ªç±»ä¸çš„æ–ÒŽ³•调用åQŒå¦‚清å•17所½Cºã€?
public void callTest() { MethodSigExample eg = new MethodSigExample(); int r = eg.test("hello", 10); } |
在第一个类ä¸é«˜äº®é€‰ä¸ test
åQŒç„¶åŽé€‰æ‹© Refactor > Change Method Signature。您ž®†çœ‹åˆ°å¦‚å›?所½Cºçš„å¯¹è¯æ¡†ã€?
�8. Change Method Signature 选项
½W¬ä¸€ä¸ªé€‰é¡¹æ˜¯æ”¹å˜è¯¥æ–ÒŽ³•çš„å¯è§æ€§ã€‚在本例ä¸ï¼Œž®†å…¶æ”¹å˜ä¸?protected 或è€?privateåQŒè¿™æ ïL¬¬äºŒä¸ª¾cÈš„ callTest()
æ–ÒŽ³•ž®×ƒ¸èƒ½è®¿é—®è¿™ä¸ªæ–¹æ³•了。(如果˜q™ä¸¤ä¸ªç±»åœ¨ä¸åŒçš„包ä¸åQŒå°†è®‰K—®æ–ÒŽ³•è®¾äØ“¾~ºçœå€ég¹Ÿä¼šå¼•赯‚¿™æ ïLš„问题。) Eclipse åœ¨è¿›è¡Œé‡æž„的时候ä¸ä¼šå°†˜q™äº›é—®é¢˜æ ‡å‡ºåQŒæ‚¨åªæœ‰è‡ªå·±é€‰æ‹©é€‚当的倹{€?
下é¢ä¸€ä¸ªé€‰é¡¹æ˜¯æ”¹å˜è¿”回值类型。如果将˜q”回值改ä¸?float
åQŒè¿™ä¸ä¼šè¢«æ ‡è®°æˆé”™è¯¯åQŒå› ä¸?test()
æ–ÒŽ³•˜q”回è¯å¥ä¸çš„ int
会自动è{æ¢æˆ float
。å³ä¾¿å¦‚æ¤ï¼Œåœ¨ç¬¬äºŒä¸ª¾cÈš„ callTest()
æ–ÒŽ³•ä¸ä¹Ÿä¼šå¼•èµ·é—®é¢˜ï¼Œå› äØ“ float
ä¸èƒ½è½¬æ¢æˆ?int
。您需è¦å°† test()
的返回值改�int
åQŒæˆ–者是ž®?callTest()
ä¸çš„ r
æ”¹äØ“ float
�
如果ž®†ç¬¬ä¸€ä¸ªå‚æ•°çš„¾cÕdž‹ä»?String
å˜æˆ int
åQŒé‚£ä¹ˆä¹Ÿå¾—考虑相åŒçš„é—®é¢˜ã€‚åœ¨é‡æž„的过½E‹ä¸˜q™äº›é—®é¢˜ž®†ä¼šè¢«æ ‡å‡ºï¼Œå› äØ“å®ƒä»¬ä¼šåœ¨è¢«é‡æž„çš„æ–ÒŽ³•内部引è“v问题åQ?int
ä¸å…·æœ‰æ–¹æ³?length()
ã€‚ç„¶è€Œå¦‚æžœå°†å…¶å˜æˆ?StringBuffer
åQŒé—®é¢˜å°±ä¸ä¼šæ ‡è®°å‡ºæ¥åQŒå› ä¸?StringBuffer
的确å…ähœ‰æ–ÒŽ³• length()
。当然这会在 callTest()
æ–ÒŽ³•ä¸å¼•èµ·é—®é¢˜ï¼Œå› äØ“å®ƒåœ¨è°ƒç”¨ test()
的时候还是把一�String
ä¼ é€’è¿›åŽÖMº†ã€?
å‰é¢æåˆ°˜q‡ï¼Œåœ¨é‡æž„引å‘了问题的情况下åQŒä¸½Ž¡é—®é¢˜æ˜¯å¦è¢«æ ‡å‡ºåQŒæ‚¨éƒ½å¯ä»¥ä¸€ä¸ªä¸€ä¸ªåœ°ä¿®æ£˜q™äº›é—®é¢˜åQŒä»¥¾l§ç®‹ä¸‹åŽ»ã€‚è¿˜æœ‰ä¸€¿U方法,ž®±æ˜¯å…ˆè¡Œä¿®æ”¹˜q™äº›é”™è¯¯ã€‚å¦‚æžœæ‚¨æ‰“ç®—åˆ é™¤ä¸å†éœ€è¦çš„傿•° i
åQŒé‚£ä¹ˆå¯ä»¥å…ˆä»Žè¦˜q›è¡Œé‡æž„的方法ä¸åˆ é™¤å¯¹å®ƒçš„å¼•ç”¨ã€‚è¿™æ ·åˆ é™¤å‚æ•°çš„˜q‡ç¨‹ž®±æ›´åŠ é¡ºåˆ©äº†ã€?
最åŽä¸€ä»‰™œ€è¦è§£é‡Šçš„事情æ˜?Default Value 选项。这一选项å€ég»…é€‚ç”¨äºŽå°†å‚æ•°åŠ å…¥æ–ÒŽ³•½{‘Öä¸çš„æƒ…况。比方说åQŒå¦‚æžœæˆ‘ä»¬åŠ å…¥äº†ä¸€ä¸ªç±»åž‹äØ“ String
çš„å‚æ•ŽÍ¼Œå‚æ•°å䨓 n
åQŒå…¶¾~ºçœå€égØ“ world
åQŒé‚£ä¹ˆåœ¨ callTest()
æ–ÒŽ³•ä¸è°ƒç”?test()
的代ç å°±å˜æˆä¸‹é¢çš„æ ·å:
public void callTest() { MethodSigExample eg = new MethodSigExample(); int r = eg.test("hello", 10, "world"); } |
在这场有å…?Change Method Signature 釿ž„çš„çœ‹ä¼¼å¯æ€•的讨论ä¸ï¼Œæˆ‘们òq¶æ²¡æœ‰éšè—å…¶ä¸çš„问题åQŒä½†å´ä¸€ç›´æ²¡æœ‰æåˆŽÍ¼Œ˜q™ç§é‡æž„其实是éžå¸¸å¼ºå¤§çš„工具åQŒå®ƒå¯ä»¥èŠ‚çº¦å¾ˆå¤šæ—‰™—´åQŒé€šå¸¸æ‚¨å¿…™å»è¿›è¡Œä»”¾l†çš„计划æ‰èƒ½æˆåŠŸåœîC‹É用它ã€?/p>