【发布时间】:2018-04-04 03:31:25
【问题描述】:
在 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,你不能重写接口方法。
如果可以选择编写函数,您还会考虑哪些其他用例?
【问题讨论】:
-
对我来说,接口就是契约,所以它不能绑定到任何实现。
-
第一个,甚至你使用第二个,让它静止。
-
您也可以将
static与第二个一起使用。在这种情况下,对它们进行单元测试会有什么不同? -
@nullpointer :这只是我添加的
utility方法以供参考....实际用例因代码而异! :) -
顺便说一句,抛出通用
java.lang.Exception是不好的做法。在这种情况下,您可以使用IndexOutOfBoundsException或创建自己的 (Runtime-)Exception。
标签: java class interface java-8