繁体   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