Flyweightパターン [Java]
@Test
public void pool() {
String author = "Henry David Thoreau";
String authorCopy = "Henry David Thoreau";
assertTrue(author.equals(authorCopy));
assertTrue(author == authorCopy);
StringBuilder builder = new StringBuilder("Henry");
builder.append(" David Thoreau");
assertTrue(author.equals(builder.toString()));
// this assertion fails!
assertTrue(author == builder.toString());
}
1. 2つのStringオブジェクトの内容は同じ
2. 2つのオブジェクトは意味的に等価
3. equals()を呼び出すことによって2つのオブジェクトの等価性を確認
4. == は authorとauthorCopyの参照(アドレス)を比較しています。
5. 2つのオブジェクトはメモリ内でも同じ場所に格納されている!
2 つのStringオブジェクトは別々に生成されているが、
Javaは密かにこれらのオブジェクトを同じ場所に格納して、メモリ空間を節約
コンパイル時にリテラルはリテラルプールに存在抽出可能
public void pool() {
String author = "Henry David Thoreau";
String authorCopy = "Henry David Thoreau";
assertTrue(author.equals(authorCopy));
assertTrue(author == authorCopy);
StringBuilder builder = new StringBuilder("Henry");
builder.append(" David Thoreau");
assertTrue(author.equals(builder.toString()));
// this assertion fails!
assertTrue(author == builder.toString());
}
1. 2つのStringオブジェクトの内容は同じ
2. 2つのオブジェクトは意味的に等価
3. equals()を呼び出すことによって2つのオブジェクトの等価性を確認
4. == は authorとauthorCopyの参照(アドレス)を比較しています。
5. 2つのオブジェクトはメモリ内でも同じ場所に格納されている!
2 つのStringオブジェクトは別々に生成されているが、
Javaは密かにこれらのオブジェクトを同じ場所に格納して、メモリ空間を節約
コンパイル時にリテラルはリテラルプールに存在抽出可能
2008-11-29 14:24
nice!(0)