Anti-Pattern
μΈμ€ν΄μ€ μμ± μ¬λ‘
λΆλ³ (Immutable Class) κ°μ²΄μ μ¬μ¬μ©μ νλ€.
μμ±ν λ³κ²½ λΆκ°λ₯ν κ°μ²΄λ‘μ λνμ μΌλ‘ String
, Boolean
, Integer
, Float
, Long
λ±λ±μ΄ μλ€.
Bad Code
String str = new String("bikini");
Better Code
String str = "bikini";
μ΅μ JVM μμμλ κ³ μ λ¬Έμμ΄μΌλ μ»΄νμΌλ¬κ° μ²μλΆν° λ°μ΄νΈ μ½λλ₯Ό StringBuilder λ‘ λ³κ²½λμ΄ μΈμ€ν΄μ€κ° μμ±λμ§ μλλ€.
νμ§λ§ κ°κΈμ λ¬Έμμ΄ μ°μ°μ΄ λ§λ€λ©΄StringBuilder
λ₯Ό κΆμ₯ λκΈ°νλ₯Ό μΌλ €νλ€λ©΄StringBuffer
λ₯Ό κΆμ₯
μ€ν λ°μ±
λ°μ±λ Warpper ν 보λ€λ μμ κΈ°λ³Έ νμ μ μ¬μ©νλ€.
private static long sum() {
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
sum += i;
}
return sum;
}
Stack Class ν΄λμ€μ λ©λͺ¨λ¦¬ λμ
μκΈ° λ©λͺ¨λ¦¬λ₯Ό μ§μ κ΄λ¦¬νλ ν΄λμ€λΌλ©΄ λ©λͺ¨λ¦¬ λμμ μ£Όμν΄μΌ νλ€.
- μΊμμ©λλ‘ μ¬μ©νλ κ°μ²΄λ
WeackHashMap
μ μ¬μ© - μ€νκ³Ό κ°μ κ°μ²΄λ μ¬μ©ν
null
λ‘ μ°Έμ‘°ν΄μ λ₯Ό μμΌμ£Όλλ‘ νλ€.
public class Stack {
private Object[] elements;
...
public Object pop() {
if (size == 0) {
throw new EmptyStackException();
}
Object result = elements[--size];
// λ€ μ΄ μ°Έμ‘°λ₯Ό ν΄μ ν΄μ£Όλλ‘ νμ
elements[--size] = null;
return result;
}
}
Finalize Method
finalize
λ©μλμ μν Collection μ§μ°κ³Ό OOME (Out of Memory Exception) λ°μ κ°λ₯μ± λλ¬Έμ μ¬μ©μ μ§μνλ€.
νΉμ Class μμ finalize λ©μλκ° μ μλμ΄ μλ κ²½μ° ν΄λΉ Class Type μ Object λ Gabege Collection λ°μμ μ¦κ°μ μΌλ‘ Collction λμ§ μλλ€.
μ΄λ Finalization Queue μ λ€μ΄κ° ν Finalizer μ μν΄ μ 리λλλ° μ°Έμ‘°κ° ν΄μ λ κ°μ²΄μ λν΄μλ finalize
λ©μλμ μν΄ GC μ€νμ΄ λ³΄μ₯λμ§ μλλ€.
λμ
AutoCloseable
μ ꡬνν΄μ£Όκ³ ν΄λμ€μμ μΈμ€ν΄μ€λ₯Ό λ€ μ¬μ©νλ©΄ close
λ©μλλ₯Ό νΈμΆν΄μ€λ€.
μ°Έκ³ μλ£
http://www.yunsobi.com/blog/entry/finalize-λ©μλμ-μ€λ²λΌμ΄λ©μ-μμ ν΄μΌνλ-μ΄μ
λ¬Έμμ΄ μ‘°ν©
Bad Code
String str = "";
for (Person p : persons) {
str += ", " + p.getName();
}
s = s.substring(2);
μ μ½λλ loop μμμ String
μ concatenation μ λ°λ³΅νλ©° νμμλ array copy μ garbage λ₯Ό λ¨λ°νλ€.
λ§μ§λ§μλ μ½€λ§λ₯Ό μ κ±°νλ μ°μ°μ ν λ² λ ν΄μ€μΌ νλ€.
Better Code
StringBuilder sb = new StringBuilder(persons.size() * 16);
for (Person p : persons) {
if (sb.length() > 0) sb.append(", ");
sb.append(p.getName());
}
StringBuffer μ±λ₯
Bad Code
StringBuffer sb = new StringBuffer();
sb.append("Name : ");
sb.append(name + '\n');
sb.append("!");
...
String s = sb.toString();
μμμ 3λΌμΈμμ String
concatenation μ΄ μΌμ΄λλ€.
λν buffer μ¬μ΄μ¦λ₯Ό μ΄κΈ°ν νμ§ μμμΌλ‘ μΈν΄ λΆνμν resizing(array copy) κ° μΌμ΄λ μ μλ€.
J2SE 5 μ΄μμμλ
synchronization
μ΄ νμμλ λ‘컬 λ³μμλStringBuffer
κ° μλStringBuilder
λ‘ μ¬μ©ν΄μΌ νλ€.
Good Code
StringBuilder sb = new StringBuilder(100);
sb.append("Name : ");
sb.append(name);
sb.append('\n');
sb.append('!');
String s = sb.toString();
String λΉκ΅
Bed Code
if (name.compareTo("John") == 0) { /* statement */ }
if (name == "John") { /* statement */ }
if (name.equals("John")) { /* statement */ }
if ("".equals(name)) { /* statement */ }
==
μ°μ°μλ κ°μ²΄ λμΉμ λν μ°μ°μ μννλ€.
equals()
λ©μλμ λ³μμ μμμ μμΉλ₯Ό λ°κΎΈλ©΄ NPE (Null Pointer Exception) λ₯Ό νΌν μ μλ μμ μ±λ μ»μμ μλ€.
λΉ λ¬Έμμ΄ μ²΄ν¬ν λλ λ¬Έμμ΄ κΈΈμ΄λ₯Ό 체ν¬νλ κ²μ΄ λΉ λ₯Έλ° equals()
μ λ©μλκ° hash code λ₯Ό λ¨Όμ κ³μ°νκΈ° λλ¬Έμ΄λ€.
Better Code
if ("John".equals(name)) { /* statement */ }
if (name.length() == 0) { /* statement */ }
μ«μλ₯Ό λ¬Έμμ΄λ‘ λ³ν
Bad Code
"" + set.size();
new Integer(set.size()).toString();
1λ² λΌμΈμμ String concatenation μ°μ°μ λΆνμνκ² ν΄μ€μΌ νλ€.
2λ² λΌμΈμμλ toString()
λ©μλλ₯Ό μννκΈ° μν΄μ Integer
ν΄λμ€λ₯Ό μμ±νκΈ°κΉμ§ νλ€.
Better Code
String.valueOf(set.size());
λΆλ³ κ°μ²΄ μ¬μ©
Bad Code
new Integer(0);
return Boolean.valueOf("true");
Integer
ν΄λμ€μ Boolean
ν΄λμ€λ λΆλ³ κ°μ²΄ (Immutable Object) μ΄λ€.
λλ¬Έμ λΆ νμνκ² κ°μ²΄λ₯Ό μμ±ν νμκ° μλ€.
Integer
μ Boolean
ν΄λμ€λ€μ μμ£Ό μ¬μ©νλ Instance μ λν΄μ Built-In Cache κ° μ‘΄μ¬νλ€.
Boolean
ν΄λμ€μ κ²½μ°μλ κ°μ΄ μ€λ‘μ§ TRUE
/ FALSE
λκ°μ§ λΏμ΄λ€.
Better Code
Integer.valueOf(0);
return Boolean.TRUE;
μ°Έκ³ μλ£
β JUnit Gson Custom Adapters β