In fact, you can combine strings with + if these are regular fields, and not a method call with some side-effect'Π°ΠΌΠΈ . The compiler is smart enough, and it replaces such places with java.lang.StringBuilder .
You can verify this by considering the following example:
public class Man { private String name; private String surname; public String firstMethod() { return name + surname; } public String secondMethod() { return new StringBuilder() .append(name) .append(surname) .toString(); }}
Let's see what is generated byte code. You can not delve into the details, the most important thing here is the explanations to it.
public class ru.izebit.Man
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
# 1 = Methodref # 9. # 25 // java / lang / Object. "" :() V
# 2 = Class # 26 // java / lang / StringBuilder
# 3 = Methodref # 2. # 25 // java / lang / StringBuilder. "" :() V
# 4 = Fieldref # 8. # 27 // en / izebit / Man.name: Ljava / lang / String;
# 5 = Methodref # 2. # 28 // java / lang / StringBuilder.append: (Ljava / lang / String;) Ljava / lang / StringBuilder;
# 6 = Fieldref # 8. # 29 // en / izebit / Man.surname: Ljava / lang / String;
# 7 = Methodref # 2. # 30 // java / lang / StringBuilder.toString: () Ljava / lang / String;
# 8 = Class # 31 // en / izebit / Man
# 9 = Class # 32 // java / lang / Object
# 10 = Utf8 name
# 11 = Utf8 Ljava / lang / String;
# 12 = Utf8 surname
# 13 = Utf8
# 14 = Utf8 () V
# 15 = Utf8 Code
# 16 = Utf8 LineNumberTable
# 17 = Utf8 LocalVariableTable
# 18 = Utf8 this
# 19 = Utf8 Lru / izebit / Man;
# 20 = Utf8 firstMethod
# 21 = Utf8 () Ljava / lang / String;
# 22 = Utf8 secondMethod
# 23 = Utf8 SourceFile
# 24 = Utf8 Man.java
# 25 = NameAndType # 13: # 14 // "": () V
# 26 = Utf8 java / lang / StringBuilder
# 27 = NameAndType # 10: # 11 // name: Ljava / lang / String;
# 28 = NameAndType # 33: # 34 // append: (Ljava / lang / String;) Ljava / lang / StringBuilder;
# 29 = NameAndType # 12: # 11 // surname: Ljava / lang / String;
# 30 = NameAndType # 35: # 21 // toString: () Ljava / lang / String;
# 31 = Utf8 en / izebit / Man
# 32 = Utf8 java / lang / Object
# 33 = Utf8 append
# 34 = Utf8 (Ljava / lang / String;) Ljava / lang / StringBuilder;
# 35 = Utf8 toString
{
public ru.izebit.Man ();
descriptor: () V
flags: ACC_PUBLIC
Code:
stack = 1, locals = 1, args_size = 1
0: aload_0
1: invokespecial # 1 // Method java / lang / Object. "" :() V
4: return
LineNumberTable:
line 4: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lru / izebit / Man;
public java.lang.String firstMethod ();
descriptor: () Ljava / lang / String;
flags: ACC_PUBLIC
Code:
stack = 2, locals = 1, args_size = 1
0: new # 2 // class java / lang / StringBuilder
3: dup
4: invokespecial # 3 // Method java / lang / StringBuilder. "" :() V
7: aload_0
8: getfield # 4 // Field name: Ljava / lang / String;
11: invokevirtual # 5 // Method java / lang / StringBuilder.append: (Ljava / lang / String;) Ljava / lang / StringBuilder;
14: aload_0
15: getfield # 6 // Field surname: Ljava / lang / String;
18: invokevirtual # 5 // Method java / lang / StringBuilder.append: (Ljava / lang / String;) Ljava / lang / StringBuilder;
21: invokevirtual # 7 // Method java / lang / StringBuilder.toString: () Ljava / lang / String;
24: areturn
LineNumberTable:
line 9: 0
LocalVariableTable:
Start Length Slot Name Signature
0 25 0 this Lru / izebit / Man;
public java.lang.String secondMethod ();
descriptor: () Ljava / lang / String;
flags: ACC_PUBLIC
Code:
stack = 2, locals = 1, args_size = 1
0: new # 2 // class java / lang / StringBuilder
3: dup
4: invokespecial # 3 // Method java / lang / StringBuilder. "" :() V
7: aload_0
8: getfield # 4 // Field name: Ljava / lang / String;
11: invokevirtual # 5 // Method java / lang / StringBuilder.append: (Ljava / lang / String;) Ljava / lang / StringBuilder;
14: aload_0
15: getfield # 6 // Field surname: Ljava / lang / String;
18: invokevirtual # 5 // Method java / lang / StringBuilder.append: (Ljava / lang / String;) Ljava / lang / StringBuilder;
21: invokevirtual # 7 // Method java / lang / StringBuilder.toString: () Ljava / lang / String;
24: areturn
LineNumberTable:
line 13: 0
line 14: 11
line 15: 18
line 16:21
line 13: 24
LocalVariableTable:
Start Length Slot Name Signature
0 25 0 this Lru / izebit / Man;
}
As we can see, both methods use java.lang.StringBuilder .
With regards to your code, it is quite correct, with the exception of excessive verbosity. StringBuilder allows StringBuilder to write more concisely using the fluent style
return builder.toString()replace - Senior Pomidor