只是一个快速形式的问题。在下面的代码中,是否有更好的方法来连接字符串(即我可以将tmpError设置为等于新字符串而不是添加它?)
public void validate () throws Exception {
String tmpError = "";
if(paramA == null) tmpError = tmpError + "paramA was not set";
if(paramB == null) tmpError = tmpError + "paramB was not set";
if(paramC == null) tmpError = tmpError + "paramC was not set";
if(!tmpError.equalsIgnoreCase("")){
tmpError = "error occured" + tmpError;
throw new Exception(tmpError);
}
}
提前致谢
答案 0 :(得分:4)
使用StringBuilder
可以轻松提高效率。
由于String
的不可变性,每次使用加法(+
)运算符进行字符串连接时,都会分配一个新的String
对象(使用时也会这样做{ {1}})。
String.concat()
保留一个内部字符数组,以便连接操作在该数组上工作,并且在调用其StringBuilder
方法时只分配一个String
对象。使用其toString()
方法将文本附加到字符串的末尾,并使用带有偏移量0的append()
来添加文本。
但是,您还应该考虑可读性。 Dasblinkenlight在他的answer中提出了一个很好的观点。正如Anthony已经指出的那样,你也可以使用insert()
复合赋值运算符来增强可读性。
+=
答案 1 :(得分:4)
我总是建议使用StringBuilder
类似的东西:
public void validate() throws Exception {
StringBuilder error = new StringBuilder();
if(paramA == null)
error.append("paramA was not set");
if(paramB == null)
error.append("paramB was not set");
if(paramC == null)
error.append("paramC was not set");
if(error.length() > 0) {
throw new Exception("error occured " + error.toString());
}
}
答案 2 :(得分:1)
您可以使用+=
(添加/连接和分配)运算符:
if(paramA == null) tmpError += "paramA was not set";
答案 3 :(得分:1)
这效率不高,因为缺少所有三个参数,您将创建四个字符串对象。最好不要附加到单个StringBuilder
对象。
但是,这是错误报告代码,只有在代码检测到编程错误时才会执行该代码。在这种情况下,效率并不重要,因为它们不应该首先发生。使用您认为更容易理解的任何内容。
答案 4 :(得分:1)
这样做:
public void validate () throws Exception {
String tmpError = "";
if(paramA == null) tmpError += "paramA was not set";
if(paramB == null) tmpError += "paramB was not set";
if(paramC == null) tmpError += "paramC was not set";
if(!tmpError.equalsIgnoreCase("")){
tmpError = "error occured" + tmpError;
throw new Exception(tmpError);
}
}
或者,您可以使用Xavi指出的StringBuilder
,但对我来说,只有在某种循环中附加文本时才有意义。
答案 5 :(得分:1)
连接两个字符串的最快方法是String类的concat函数。
public void validate () throws Exception {
String tmpError = "";
if(paramA == null) tmpError = tmpError.concat("paramA was not set");
if(paramB == null) tmpError = tmpError.concat("paramB was not set");
if(paramC == null) tmpError = tmpError.concat("paramC was not set");
if(!tmpError.equalsIgnoreCase("")){
tmpError = "error occured".concat(tmpError);
throw new Exception(tmpError);
}
}
答案 6 :(得分:1)
您可能希望使用Guava Preconditions,而不是上述任何一项。然后你可以写这样的代码:
import static com.google.common.base.Preconditions.*;
...
public void doSomething(String strA, String strB) {
checkNotNull(strA, "strA is missing");
checkArgument(strB.length() >= 6, "strB is too short");
...
}
如果检查失败,则抛出Exception
。它可能不像你原来的解决方案那么简洁,但你的意图在语义上是显而易见的。
答案 7 :(得分:0)
我会做如下的事情 public void validate()抛出异常{
public void validate () throws Exception {
String tmpError = "";
if(paramA == null) tmpError += "paramA was not set";
if(paramB == null) tmpError += "paramB was not set";
if(paramC == null) tmpError += "paramC was not set";
if(!(tmpError.trim()).equalsIgnoreCase("")){
tmpError = "error occured" + tmpError;
throw new Exception(tmpError);
}
}
请参阅我已使用+=
并修剪tmpError
变量,然后再将其检查为空。
我不认为你不需要担心StringBuilder
,因为在这种情况下没有多少内存被处理。
如果您坚持使用StringBuilder,那么您可以执行以下操作
public void validate () throws Exception {
StringBuilder sb = new StringBuilder();
if(paramA == null) sb.append("paramA was not set");
if(paramB == null) sb.append("paramB was not set");
if(paramC == null) sb.append("paramC was not set");
if(!(sb.toString().trim()).equalsIgnoreCase("")){
sb.Insert(0,"error occured");
throw new Exception(sp.toString());
}
}