簡體   English   中英

接口方法與類方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM