2013-03-04 59 views
0

所以我有一个很大的字符串,它只会变大。目前它有1,539个字符,我希望将来可以对它做更多的疑问。所以当我第一次构建字符串时,我用7个字符串对象创建了老式的方式,并将它们与加号连接起来。大字符串字符串生成器缺点

但后来我想起了老师说什么时候回来的时候,并决定切换它并尝试字符串生成器。唯一的问题是我可以在网上找到的唯一真正的缺点是使用这种可读性,而且我不认为可靠性是不诚实的。

所以我的问题是建立一个对象,容纳超过1500个字符的好主意或坏主意。如果你是我的情况,你会使用字符串,字符串生成器,或字符串缓冲区?请将讲话保存在可读性上。这只是我的代码,我是唯一阅读它的代码,并不是那么困难,所以不要将它用作变量。谢谢!

StringBuilder builder = new StringBuilder(1600); 
builder.append("SELECT stride.id AS link, user.userName, user.displayName, user.currentDefault, stride.content, stride.timestamp, stride.recipientView, \"stride\" as notType FROM user INNER JOIN stride ON user.id = stride.sourceUserId WHERE stride.recipientId = ? AND stride.sourceUserId != ? "); 
builder.append(" UNION ALL "); 
builder.append("SELECT stride.id AS link, user.userName, user.displayName, user.currentDefault, stride.content, strideLike.timestamp, strideLike.recipientView, \"strideLike\" as notType FROM user INNER JOIN strideLike ON strideLike.sourceUserId = user.id INNER JOIN stride ON stride.id = strideLike.strideId WHERE strideLike.recipientId = ? AND user.id != strideLike.recipientId "); 
builder.append(" UNION ALL "); 
builder.append("SELECT stride.id AS link, user.userName, user.displayName, user.currentDefault, strideComment.content, strideComment.timestamp, strideComment.recipientView, \"strideCommentMe\" as notType FROM user INNER JOIN strideComment ON user.id = strideComment.sourceUserId INNER JOIN stride ON stride.id = strideComment.strideId WHERE stride.sourceUserId = ? AND user.id != stride.sourceUserId "); 
builder.append(" UNION ALL "); 
builder.append("SELECT stride.id AS link, user.userName, user.displayName, user.currentDefault, strideComment.content, strideCommentLike.timestamp, strideCommentLike.recipientView, \"strideCommentLike\" AS notType FROM user INNER JOIN strideCommentLike ON strideCommentLike.sourceUserId = user.id INNER JOIN strideComment ON strideComment.id = strideCommentLike.commentId INNER JOIN stride ON stride.id = strideComment.strideId WHERE strideComment.sourceUserId = ? AND user.id != ? "); 
builder.append(" ORDER BY timestamp DESC"); 
+0

这就是我原来的。但是,然后改变查询的部分变成了一场噩梦 – gmustudent 2013-03-04 06:33:43

+0

你可以把它写成多个字符串的串联。字符串文字的连接将在编译时而不是运行时完成。 – nhahtdh 2013-03-04 06:34:39

回答

5

如果您不需要对字符串进行任何其他操作,则应该对此使用字符串连接。如果没有变量被添加到字符串中,那么字符串连接将在编译时发生。

使用StringBuilder强制连接在运行时执行,而不管是否有变量被追加。

+0

所以你只在使用变量时使用字符串生成器和缓冲区? – gmustudent 2013-03-04 06:34:22

+1

+1。我正在寻找一个链接,证明编译器将实际上将'String'串联替换为'StringBuilder'调用,并且看起来[它是](http://docs.oracle.com/javase/specs/jls/se5.0 /html/expressions.html#15.18.1.2)。 – 2013-03-04 06:35:40

0

StringBuilder如果在运行时生成字符串会更有效。

使用这两种方法都不会有什么不同,编译器会做必要的优化。

StringBuilder builder = new StringBuilder(1600); 
builder.append("SELECT stride.id AS link, user.userName, user.displayName, user.currentDefault, stride.content, stride.timestamp, stride.recipientView, \"stride\" as notType FROM user INNER JOIN stride ON user.id = stride.sourceUserId WHERE stride.recipientId = ? AND stride.sourceUserId != ? "); 
builder.append(" UNION ALL "); 
builder.append("SELECT stride.id AS link, user.userName, user.displayName, user.currentDefault, stride.content, strideLike.timestamp, strideLike.recipientView, \"strideLike\" as notType FROM user INNER JOIN strideLike ON strideLike.sourceUserId = user.id INNER JOIN stride ON stride.id = strideLike.strideId WHERE strideLike.recipientId = ? AND user.id != strideLike.recipientId "); 
builder.append(" UNION ALL "); 
builder.append("SELECT stride.id AS link, user.userName, user.displayName, user.currentDefault, strideComment.content, strideComment.timestamp, strideComment.recipientView, \"strideCommentMe\" as notType FROM user INNER JOIN strideComment ON user.id = strideComment.sourceUserId INNER JOIN stride ON stride.id = strideComment.strideId WHERE stride.sourceUserId = ? AND user.id != stride.sourceUserId "); 
builder.append(" UNION ALL "); 
builder.append("SELECT stride.id AS link, user.userName, user.displayName, user.currentDefault, strideComment.content, strideCommentLike.timestamp, strideCommentLike.recipientView, \"strideCommentLike\" AS notType FROM user INNER JOIN strideCommentLike ON strideCommentLike.sourceUserId = user.id INNER JOIN strideComment ON strideComment.id = strideCommentLike.commentId INNER JOIN stride ON stride.id = strideComment.strideId WHERE strideComment.sourceUserId = ? AND user.id != ? "); 
builder.append(" ORDER BY timestamp DESC"); 

String query = "SELECT stride.id AS link, user.userName, user.displayName, user.currentDefault, stride.content, stride.timestamp, stride.recipientView, \"stride\" as notType FROM user INNER JOIN stride ON user.id = stride.sourceUserId WHERE stride.recipientId = ? AND stride.sourceUserId != ? " + 
" UNION ALL " + 
"SELECT stride.id AS link, user.userName, user.displayName, user.currentDefault, stride.content, strideLike.timestamp, strideLike.recipientView, \"strideLike\" as notType FROM user INNER JOIN strideLike ON strideLike.sourceUserId = user.id INNER JOIN stride ON stride.id = strideLike.strideId WHERE strideLike.recipientId = ? AND user.id != strideLike.recipientId " + 
" UNION ALL " + 
"SELECT stride.id AS link, user.userName, user.displayName, user.currentDefault, strideComment.content, strideComment.timestamp, strideComment.recipientView, \"strideCommentMe\" as notType FROM user INNER JOIN strideComment ON user.id = strideComment.sourceUserId INNER JOIN stride ON stride.id = strideComment.strideId WHERE stride.sourceUserId = ? AND user.id != stride.sourceUserId " + 
" UNION ALL " + 
"SELECT stride.id AS link, user.userName, user.displayName, user.currentDefault, strideComment.content, strideCommentLike.timestamp, strideCommentLike.recipientView, \"strideCommentLike\" AS notType FROM user INNER JOIN strideCommentLike ON strideCommentLike.sourceUserId = user.id INNER JOIN strideComment ON strideComment.id = strideCommentLike.commentId INNER JOIN stride ON stride.id = strideComment.strideId WHERE strideComment.sourceUserId = ? AND user.id != ? " + 
" ORDER BY timestamp DESC" +