接口方法与类方法

时间:2018-04-04 03:31:25

标签: java class interface java-8

在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,您不能覆盖接口方法。

那么,如果您有选择编写函数的话,您会考虑其他用例吗?

2 个答案:

答案 0 :(得分:3)

对于明确开发的任何实用程序,我建议使用类。 java中的Default methods有一个特殊用途。这些是用于需要从供应商(记住? - An interface is a contract between Vendor and User)实施的实用方法。

例如,如果您正在使用任何第三方库,并且有一天供应商引入了新的实用程序功能,那么所有客户都必须在界面内覆盖该方法,或者它只是供应商添加静态默认方法。这样,具有新库的代码仍然向后兼容(at binary code level)。

准确地说,使用&amp; Oracle文档中详细解释了功能接口的用途如下: -

  

默认方法使您能够向库的接口添加新功能,并确保与为这些接口的旧版本编写的代码具有二进制兼容性。

有关详情,请阅读官方文档here

此外,鉴于此目的,在您编写此类方法之前,永远不需要在您的末尾测试默认方法。如果实用方法很复杂,则应对其进行测试。这些实用程序肯定可以进行集成测试。另外,正如您所说,您可以编写一个简单的接口实现并测试一些东西。这与测试abstract class类似。请阅读here了解详情。

答案 1 :(得分:2)

首先,为了在接口中定义方法,您需要使用default关键字。通常,接口中没有定义方法 - 这可能是类和接口之间的最大区别。

现在,您希望在不相关的类中使用 GUARANTEE共享功能时使用界面。例如,Serializable接口可确保实现此接口的 ANY 类为Serializable。我不打算解释“Serializable”在这里意味着什么,但我的想法是,不要让数百个类在一个混乱的子类树中扩展一个抽象的Serializable类,你可以简单地实现Serializable并使用的功能多态性将您的班级称为Serializable。在这里查看更多精彩信息:https://www.tutorialspoint.com/java/java_interfaces.htm

在您的情况下,您需要一个StringUtil类,而不是StringUtil接口。因为StringUtil只包含一个实用程序方法,所以你也想制作这个方法(maskString())static