[英]interfaces methods vs classes methods
在Java-8中,我們可以使用多種方法來屏蔽字符串 :
接口實現
public interface StringUtil {
static String maskString(String strText, int start, int end, char maskChar)
throws Exception{
if( Strings.isNullOrEmpty(strText))
return "";
if(start < 0)
start = 0;
if( end > strText.length() )
end = strText.length();
if(start > end)
throw new Exception("End index cannot be greater than start index");
int maskLength = end - start;
if(maskLength == 0)
return strText;
StringBuilder sbMaskString = new StringBuilder(maskLength);
for(int i = 0; i < maskLength; i++){
sbMaskString.append(maskChar);
}
return strText.substring(0, start)
+ sbMaskString.toString()
+ strText.substring(start + maskLength);
}
}
可以通過以下方式訪問:
StringUtil.maskString("52418100", 2, 4, 'x')
現在可以通過以下類實現相同的功能
public class StringUtil {
public String maskString(String strText, int start, int end, char maskChar)
throws Exception{
if( Strings.isNullOrEmpty(strText))
return "";
if(start < 0)
start = 0;
if( end > strText.length() )
end = strText.length();
if(start > end)
throw new Exception("End index cannot be greater than start index");
int maskLength = end - start;
if(maskLength == 0)
return strText;
StringBuilder sbMaskString = new StringBuilder(maskLength);
for(int i = 0; i < maskLength; i++){
sbMaskString.append(maskChar);
}
return strText.substring(0, start)
+ sbMaskString.toString()
+ strText.substring(start + maskLength);
}
}
可以通過以下方式訪問:
StringUtil su = new StringUtil()
String mask = su.maskString("52418100", 2, 4, 'x')
題:
在這種情況下,哪個優先? 到目前為止,我知道interface
函數是無法通過mock
測試的,因此我必須在接口函數之上擁有一個包裝器函數(簡而言之) ,它不適合單元測試,並且由於是static
,因此無法覆蓋接口方法。
那么,如果可以選擇編寫函數,您還考慮其他哪些用例?
對於任何明確開發的實用程序,我建議使用一個類。 Java中的Default methods
具有特殊目的。 這些旨在用作實用程序方法,需要從供應商那里獲得實現( 記住嗎? - An interface is a contract between Vendor and User
)。
例如 ,如果您正在使用任何第三方庫,而供應商又有一天引入了新的實用程序功能,則要么所有客戶都必須在界面中覆蓋該方法,要么僅僅是供應商添加了靜態默認方法。 這樣,帶有新庫的代碼仍然向后兼容( at binary code level
)。
准確的說,功能文檔的用法和目的在Oracle文檔中有很好的解釋,如下所示:
默認方法使您可以向庫的接口添加新功能,並確保與為這些接口的較早版本編寫的代碼二進制兼容。
有關更多信息,您可以在此處閱讀官方文檔。
同樣,鑒於此目的,除非您是編寫此類方法的人,否則最終無需測試默認方法。 如果實用程序方法很復雜,則應進行測試。 這些工具肯定可以進行集成測試。 而且,正如您所說的,您可以編寫接口的簡單實現並測試事物。 這類似於測試abstract class
。 在此處閱讀更多信息。
首先,為了在接口中定義方法,您需要使用default關鍵字。 通常,方法未在接口中定義-這可能是類和接口之間的最大區別。
現在,當您想保證不相關的類之間共享功能時,可以使用一個接口。 例如, Serializable
接口保證實現此接口的任何類都是Serializable
。 我在這里不打算解釋“ Serializable”的含義,但是它的想法是,不是讓數百個類在一個雜亂的子類樹中擴展一個抽象的Serializable類,您可以簡單地實現Serializable並使用Polymorphism的功能進行引用作為類Serializable
。 在這里查看更多真棒信息: https : //www.tutorialspoint.com/java/java_interfaces.htm
在您的情況下,您需要一個StringUtil類,而不是StringUtil接口。 由於StringUtil僅包含一個實用程序方法,因此您還希望將此方法(maskString())設置為static
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.