界面实施
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
,您不能覆盖接口方法。
那么,如果您有选择编写函数的话,您会考虑其他用例吗?
答案 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
。