介面向下轉型,子類方法安全問題

2022-07-16 02:06:11 字數 1778 閱讀 7984

舉個栗子,httpservlet有這麼乙個方法 service(httpservletrequest req, httpservletresponse resp),兩個引數型別都是介面;httpservletrequest是servlet提供的乙個介面,它會有很多實現類,這些類會實現介面方法,也可能會新增自己的方法。service()在處理請求時使用到req,req可以呼叫介面方法;在開發人員知道req具體的實現類的情況下,祂們可以將req向下轉型成實現類,從而呼叫實現類的特有方法,這樣的特有方法並不是每個實現類都有的。

如下方**,myrequest則是httpservletrequest的實現類。下方**呼叫service()傳入myrequest例項,該例項會自動向上轉型為httpservletrequest型別。service()中呼叫myrequest的getprivateinfo()。這樣編碼將導致service()方法與呼叫方耦合,在改變引數實現類的同時需要改變service()的實現邏輯。所以我們應該杜絕這種向下轉型的編碼方式,但是僅僅靠編碼規範怕是約束不了祂們(滑稽)。我們需要一種方法,禁止呼叫子類特有方法。

//service()呼叫

//以下為介面方法實現

問題:如何禁止子類特有方法的呼叫。

改變特有方法的訪問範圍,protected或者private?特有方法有可能會在類外,甚至是包外呼叫,所以不行。(這裡說的呼叫是類例項直接呼叫,不是什麼說的向下轉型再呼叫的情況)

方法:借助外觀類。**如下,這時service()呼叫傳入的是requestfacade例項,通過該例項可以間接呼叫myrequest實現的介面方法;而特有方法外觀類沒有,即使向下轉型成requestfacade也無法呼叫;requestfacade類內的request屬性又是私有的,無法通過request以原來的手段達到目的。這般如此,總算是遏制了那些歪門邪道,功德無量。

//

service()呼叫

//介面方法的實現直接呼叫構造方法傳過來例項的方法

@override

public

string getauthtype()

@override

public

cookie getcookies()

...}

多執行緒安全問題 同步方法

2 同步方法 同步方法是指進入該方法時需要獲取this 物件的同步鎖,在方法上使用 synchronized 關鍵字,使用this 物件作為鎖,也就是使用了當前物件,因為鎖住了方法,所以相對於代 碼塊來說效率相對較低。注 靜態同步方法的鎖是該方法所在的類的位元組碼檔案物件,即類名.class 檔案 ...

執行緒安全問題以及解決方法

我們通過 來了解一下,下面是乙個模擬賣票的案例,首先我們先定義乙個票ticked類實現runnable介面 class ticket implements runnable catch interruptedexception e ticked system.out.println 賣了一張票,還剩...

解決執行緒安全問題 使用同步方法

賣票案例出現了執行緒安全問題 賣出了不存在的票和重複的票 解決執行緒安全問題的二種方案 使用同步方法 使用步驟 1.把訪問了共享資料的 抽取出來,放到乙個方法中 2.在方法上新增synchronized修飾符 格式 定義方法的格式 修飾符 synchronized 返回值型別 方法名 引數列表 1....