2010-03-15 53 views
2

它總是顯得有些在使用Java的原則相抵觸的Java Servlet規範(2.5版here)包括一組包含信息關於包括資源,即魔法屬性:爲什麼Servlet規範中有魔術屬性暴露?

javax.servlet.include.request_uri 
javax.servlet.include.context_path 
javax.servlet.include.servlet_path 
javax.servlet.include.path_info 
javax.servlet.include.query_string 

它甚至沒有明確指出在API documentation中,只有在規範中它是必須正確實現的規範。

這種方法感覺非常錯誤,客戶將使用和依賴的公開實現細節。爲什麼這種信息以這種方式暴露?

回答

4

它們實際上在API文檔中的Constant Field Values部分中指定。當你的API文檔中看到,你應該使用的RequestDispatcher常數代替,例如:

String includeRequestURI = request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI); 
+0

我從來沒有意識到它們是在API文檔的深處指定的!使用常量使得更有意義,謝謝! – Brabster 2010-03-15 19:14:23

2

,你不應該在你的代碼中使用的原始常數(神奇數字),這一事實並不意味着當接口確實需要傳入一個必須指定的常量。

從用戶的角度來看,只有常量是有效的,但從實現的角度來看,如果不同的系統需要交互,那麼這些常量必須與實際值匹配。如果常量在不同的實現中不一致地定義,那麼在一個實現中編譯的類(可能內聯在二進制中的常量值)將無法在不同的實現中工作。

請注意,代碼不依賴於幻數仍然很重要,因爲規範可以在以後的任何複審中定義不同的值(如果他們決定的話)。