2013-03-04 4 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

+0

여러 문자열을 병합하여 작성할 수 있습니다. 문자열 리터럴의 연결은 런타임 대신 컴파일 타임에 수행됩니다. – nhahtdh

답변

5

문자열에 대해 다른 작업을 수행 할 필요가없는 경우 문자열 연결을 사용해야합니다. 문자열에 변수가 추가되지 않으면 컴파일시 문자열 연결이 수행됩니다.

StringBuilder를 사용하면 변수가 추가되는지 여부에 관계없이 런타임에 연결이 강제로 수행됩니다.

+0

변수를 사용할 때 문자열 작성기와 버퍼 만 사용합니까? – gmustudent

+1

+1. 나는 컴파일러가 실제로'String' 연결을'StringBuilder' 호출로 대체 할 것이라는 것을 증명하는 링크를 찾고 있었고 [여기있다] (http://docs.oracle.com/javase/specs/jls/se5.0) /html/expressions.html#15.18.1.2). –

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" + 
관련 문제