Design Patterns of Object Creation

Revised: 06th/Dec./2003; Since: Oct./14th/2003

$B%*%V%8%'%/%H$N@8@.$NM^@)(B

$B%*%V%8%'%/%H$N@8@.!?GK4~$O!"Hf3SE*%3%9%H$N9b$$=hM}$G$9!#%*%V%8%'%/%H$N@8@.$rM^$($k$?$a$K!"0lC6@8@.$7$?%*%V%8%'%/%H$r!"%3%l%/%7%g%s%/%i%9$dG[Ns$r;H$C$F%W!<%k$7$F:FMxMQ$9$k9)IW$,8E$/$+$i:NMQ$5$l$F$$$^$9!#(B

$BFC$K!"%9%H%j!<%`$d(B DB $B%3%M%/%7%g%s!"%9%l%C%I$J$I$N!"@8@.;~$K4D6-$N%;%C%H%"%C%W$N%3%9%H$,9b$$>l9g$O!"%*%V%8%'%/%H$N@8@.$rM^@)$9$k$3$H$O!"%Q%U%)!<%^%s%9>e$b>iD9@-$NGS=|$NE@$G$bM-8z$G$9!#GK4~$KH<$&(B GC $B$N=hM}$O!"(BJava2 1.3/1.4 $BAjEv0J>e$G$O$+$J$j2~A1$5$l$F$$$k$?$a!"@8@.$N%3%9%H$,9b$$>l9g$r=|$$$F$O!"%W!<%j%s%0$N%*!<%P!<%X%C%I$NJ}$,9b$/$J$k798~$K$"$j$^$9!#(B

$B$3$3$G$O!"%*%V%8%'%/%H$N@8@.$rM^@)$9$k@_7W$H$7$F!"R2p$7$^$9!#(B

$B%*%V%8%'%/%H!&%W!<%j%s%0!'(BFlyweight$B%Q%?!<%s(B

$B%G%6%$%s%Q%?!<%s$G!"(BFlyweight $B%Q%?!<%s$H8F$P$l$k$b$N$,$"$j$^$9!#K\Mh$O!">.$5$J%*%V%8%'%/%H!J%U%i%$5i%*%V%8%'%/%H!K$NB??t$N@8@.$rHr$1$k$?$a$N$b$N$G$9$,!"8=:_$G$O!"5pBg$J%*%V%8%'%/%H!J%X%S!<5i%*%V%8%'%/%H!K$N@8@.Ii2Y$,9b$$>l9g$K!"Hs>o$K8z2LE*$G$9!#(B

$BFC$K8E$$(B JVM $B$N>l9g$O!"B??t$N>.$5$J%*%V%8%'%/%H$N@8@.!?GQ4~$O!"(BGC $B$N5/F0$KH<$&%*!<%P!<%X%C%I$N%3%9%H$,9b$$=hM}$G$7$?!#$7$+$7!"!V%*%V%8%'%/%H$N@8@.$NM^@)!W$G=R$Y$?$h$&$K!"%W!<%j%s%0$J$I$N%*!<%P!<%X%C%I$rI,MW$H$9$k4IM}5!G=$rl9g$O!"4IM}%3%9%H$N$[$&$,9b$/$J$k2DG=@-$,$"$j$^$9!#(BHotSpot $BAjEv0J>e$N(B JVM $B$rMxMQ$9$k>l9g$O!">.$5$J%*%V%8%'%/%H$KBP$9$k%W!<%j%s%0$r:NMQ$9$k$+$I$&$+$NH=CG$O!"%W%m%U%!%$%i$K$h$k8!>Z7k2L$K$f$@$M$i$l$^$9!#(B

$B0lJ}!"Bg$-$J%*%V%8%'%/%H$d@8@.Ii2Y$,9b$$>l9g$O!"%W!<%j%s%0$,M-8z$G$9!#%*%V%8%'%/%H$N%W!<%j%s%0$r

$B%+%N%K%+%k2=%^%C%W(B

$B0lHL$K!"%a%=%C%I(B equals() $B$,(B true $B$rJV$9Ey2A$J%*%V%8%'%/%H$r!"1i;;;R(B == $B$,(B true $B$rJV$90l0U$J%*%V%8%'%/%H$GCV$-49$($k$3$H$r!"%+%N%K%+%i%$%

Flyweight $B%Q%?!<%s$r;H$C$F!"%+%N%K%+%i%$%

$B%W!<%k$5$l$k%*%V%8%'%/%H$N%/%i%9!'(B

class MyClass {
    private String name;
    public MyClass(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

MyClass $B$,Bt;3F~$C$?%W!<%k$r4IM}$9$k%/%i%9$H$7$F(B MyClassManager $B$r:n$j$^$9!#$3$N%/%i%9$O!"%/%i%$%"%s%H!&%3!<%I$+$i$NMW5a$KBP$7$F!"(BMyClass $B7?%*%V%8%'%/%H$No$KF1$8MyClassManager $B$r!"(B$B%+%N%K%+%k2=%^%C%W(B$B$H8F$S$^$9!#(B

  1. $B@8@.;~$N0z?t$K1~$8$??t$N(B MyClass $B7?%*%V%8%'%/%H$r!"FbIt$N(B MyClass $B7?G[Ns(B pool[] $B$GJ];}$7$^$9!#(B
  2. $B%a%=%C%I(B getMyClass() $B$N0z?t$NJ8;zNs$H!"%W!<%kFb$N%*%V%8%'%/%H$rHf$Y$F!"(B
    • $B$b$7B8:_$9$l$P%W!<%kFb$N%*%V%8%'%/%H$rJV$7!"(B
    • $BB8:_$7$J$1$l$P?7$?$K@8@.$7$F%W!<%k$KJ|$j9~$_$^$9!#(B

$B%+%N%K%+%k2=%^%C%W!'(B

class MyClassManager {
    private MyClass[] pool;
    private int counts = 0;
    
    // $B%3%s%9%H%i%/%?(B
    public MyClassManager(int size) {
        pool = new MyClass[size];
    }
    // MyClass$B%*%V%8%'%/%H$Nl9g(B
                if (pool[i].getName().equals(name)) {
                    return pool[i];
                }
            }
        }
        pool[counts] = new MyClass(name);
        return pool[counts++];
    }
}

$B%+%N%K%+%k2=%^%C%W$G$"$k(B MyClassManager $B$rMxMQ$9$k%/%i%$%"%s%H$O!"

$B%+%N%K%+%k2=%^%C%W$N%/%i%$%"%s%H!&%3!<%I!'(B

class MyClassDemo {
    public static void main(String[] args) {
        // $B%W!<%kFb$N(B MyClass $B7?%*%V%8%'%/%H$N8D?t$r(B 5 $B8D$K;XDj(B
        MyClassManager manager = new MyClassManager(5);
        for (int i = 0; i < 10; i++) {
            // 10 $B8D$N(B MyClass $B7?%*%V%8%'%/%H$r@8@.(B
            // MyClass obj = new MyClass(i);
            
            // 5 $B8D$N(B MyClass $B7?%*%V%8%'%/%H$r@8@.(B
            MyClass obj = manager.getMyClass(Integer.toString(i % 5));
            
            System.out.println("name: " + obj.getName());
        }
    }
}

MyClassManager $B$O(B 5 $B8D$NMWAG$r%W!<%k$KJ];}$G$-$k$h$&$K@8@.$7$F$$$^$9!#(B

10 $B2s7+$jJV$9%k!<%WFb$G!"%*%V%8%'%/%H$N@8@.$r9T$C$F$$$^$9!#(B

$B$b$7!"(BMyClass $B$N%$%s%9%?%s%9$r(B new $B$9$k$N$G$"$l$P!"(B10 $B8D$N%*%V%8%'%/%H$,@8@.$5$l!"%W!<%k$O%Q%s%/$7$^$9!#$7$+$7!"(BgetMyClass() $B$G@8@.$9$k%*%V%8%'%/%H$NL>A0$H$7$F!"(B0$B!A(B4 $B$N(B 5 $BMyClass $B7?%*%V%8%'%/%H$O(B 5 $B$D$@$1$7$+@8@.$5$l$:!"%W!<%k$O%Q%s%/$7$^$;$s!#(B

$B

>javac MyClassDemo.java
>java MyClassDemo
objs: 0, name: 0
objs: 1, name: 1
objs: 2, name: 2
objs: 3, name: 3
objs: 4, name: 4
objs: 5, name: 0
objs: 5, name: 1
objs: 5, name: 2
objs: 5, name: 3
objs: 5, name: 4

$B3N$+$K!"(B5 $B

$B$3$NNc$G$O!"G[Ns(B pool[] $B$N3HD%$N%m%8%C%/$,AH$_9~$^$l$F$$$J$$$?$a$K!"(Bmanager $B@8@.;~$K;XDj$7$?MWAG?t(B 5 $B8D0J>e$Nmanager $B$N%a%=%C%I(B getMyClass() $BFbIt$G!"Nc30(B java.lang.ArrayIndexOutOfBoundsException $B$,H/@8$7$^$9!#G[Ns$N3HD%$K$O!"$h$jBg$-$J%5%$%:$NG[Ns$r$D$/$j!"4{B8$N$b$N$r(B System.arraycopy() $B$G%3%T!<$9$k$3$H$K$J$j$^$9!#3HD%$,H<$&>l9g$d!"%*%V%8%'%/%H$r0l0U$K;XDj$9$k<1JL;R$,B8:_$9$k>l9g$O!"%W!<%k$NVector $B$d(B HashMap $B$N$h$&$J!"%3%l%/%7%g%s!&%U%l!<%`%o!<%/$N%/%i%9$NMxMQ$r8!F$$9$k$3$H$b$G$-$^$9!#(B

$B$3$3$GNc$K5s$2$?$h$&$K!"%*%V%8%'%/%H$Nl9g$O!"J#?t$NF1$8H$9$k$b$N$G$"$k$3$H$,J]>c$G$-$l$P!"Hf3S;~$K$OEy2A@-$rI>2A$9$k(B equals() $B$H!";2>H$NF1CM$rI>2A$9$k(B == $B$,F10l$N7k2L$r<($9$3$H$K$J$j!"%G!<%?$N%$%s%F%0%j%F%#$NLL$G$bM-8z$G$9!#(B

$B%*%V%8%'%/%H!&%W!<%j%s%0(B

Flyweight $B%Q%?!<%s$K$O!"JL$NMxMQJ}K!$H$7$F!"@8@.:Q$_$N6u$N%*%V%8%'%/%H$r%W!<%k$7$F$*$-!"Aa$$!$A$G!"6u$$$F$$$k%*%V%8%'%/%H$rJV$9$h$&$J>l9g$K$b;H$($^$9!#$3$N>l9g!"4IM}%*%V%8%'%/%H$K$O!":FMxMQ2DG=$K$9$k$?$a$N=*N;%m%8%C%/$rMQ0U$7$F!"%/%i%$%"%s%HB&$G$O!";H$$=*$o$C$?$i!"4IM}%*%V%8%'%/%H$N=*N;%a%=%C%I$r8F$S=P$9I,MW$,$"$j$^$9!#Nc$($P!"

1. $B%3%s%9%H%i%/%?$G!"(Bpool[] $B$HBP$K$J$k(B boolean $B7?$NG[Ns(B inUse[] $B$K(B false $B$r%;%C%H$9$k(B
    boolean[] inUse;
    for (int i = 0; inUse.length; i++) {
        inUse[i] = false;
    }
2. $BinUse[i] $B$,(B false $B$G$"$k(B i $B$KBP$7$F(B pool[i] $B$rJV$7!"(BinUse[i] $B$K(B true $B$r%;%C%H$9$k(B
    for (int i = 0; i < inUse.length; i++) {
        if (inUse[i] == false) {
            inUse[i] = true;
            return pool[i];
        }
    }
3. pool[i] $B$G
    // ...$B>JN,(B...
4. $B=*N;%a%=%C%I$r5/F0$7$F!";H$$=*$o$C$?(B pool[i] $B$r%G%U%)%k%HCM$G=i4|2=$7!"BP1~$9$k(B inUse[i] $B$K(B false $B$r%;%C%H$9$k(B
    // obj$B$O=*N;%a%=%C%I$N0z?t$GJN,(B...
        // $B=i4|:Q$_%*%V%8%'%/%H$r:FMxMQ2DG=$K$9$k(B
        inUse[i] = false;
    }

$B%*%V%8%'%/%H$N:FMxMQ$d!"%+%N%K%+%k2=$NM}M3$G!"%W!<%k$rMxMQ$9$k>l9g$O!"(BFlyweight $B%Q%?!<%s$NMxMQ$r8!F$$7$^$7$g$&!#0lHL$K!"FH<+

$B%$%s%9%?%s%9?t$N@)8B!'(BSingleton$B%Q%?!<%s(B

Flyweight $B%Q%?!<%s$G8+$?$h$&$J!"%3%s%F%J$H$J$k4IM}%*%V%8%'%/%H$O!"%5%$%:$,5pBg$K$J$k2DG=@-$,$"$j$^$9!#5pBg$J%*%V%8%'%/%H$OJ#?t@8@.$5$l$J$$$h$&$K$7$F$*$-$?$$$3$H$,$"$j$^$9!#$^$?!"@8@.$5$l$k%*%V%8%'%/%H$r!"l9g$b!"4IM}%*%V%8%'%/%H$,J#?t@8@.$5$l$k$H:$$j$^$9!#%/%i%9$KBP$9$k%$%s%9%?%s%9$N8D?t$r@)8B$9$k$N$,!"(BSingleton $B%Q%?!<%s!J0l?M$C;R%Q%?!<%s!K$G$9!#(B

Singleton $B%Q%?!<%s$N%]%$%s%H$O!"%3%s%9%H%i%/%?$r(B private, static $B=$>~$7$F!"%$%s%9%?%s%9$O%a%=%C%I(B getter $B$GMyClassManager $B$N>l9g$O!"

class MyClassManager {
    // $B<+?H$N(BSingleton$B%$%s%9%?%s%9(B
    private static MyClassManager manager = new MyClassManager(10);
    // $B%U%!%/%H%j<+?H$NJ#@=$r:n$i$l$J$$$h$&$K$9$k(B
    private MyClassManager(int size) {
        pool = new MyClass[size];
        inUse = new boolean[size];
        for (int i = 0; i < size; i++) {
            pool[i] = new MyClass();
            inUse[i] = false;
        }
    }
    // $B%U%!%/%H%j$N%$%s%9%?%s%9$r

$B%3%s%9%H%i%/%?$b%U%#!<%k%I$b(B private $B=$>~$5$l$F$$$k$?$a!"%/%i%$%"%s%H%3!<%I$+$i$O@8@.$G$-$^$;$s!#(Bstatic $B=$>~$5$l$F$$$k%U%#!<%k%I(B manager $B$O!"%/%i%9$N%m!<%I;~$K0l2s$@$1=i4|2=$5$l$k$?$a!"J#?t@8@.$5$l$k$3$H$O$"$j$^$;$s!#(B

$B%/%i%$%"%s%HB&$G$O!"(Bstatic $B%a%=%C%I$G$"$k(B getManager() $B$r;H$C$F!"M#0l$N%$%s%9%?%s%9(B manager $B$K%"%/%;%9$9$k$3$H$K$J$j$^$9!#(B

$B$3$NNc$G$O!"$?$C$?0l$D$N%$%s%9%?%s%9$7$+B8:_$G$-$J$$$h$&$K$7$F$$$^$9$,!"%$%s%9%?%s%9$rG[Ns$GJ];}$7$?$j!"FbIt$K%+%&%s%?!<$r;}$D$3$H$J$I$K$h$C$F!"@8@.$5$l$k8D?t$r@)8B$9$k$h$&$KJQ99$9$k$3$H$b$G$-$^$9!#(B

$B0x$_$K!"%^%k%A!&%9%l%C%I$GMxMQ$9$k>l9g$O!"(Bpool $B$K@8@.$9$k%*%V%8%'%/%H$NgetMyClass() $B$J$I$K(B syncronized $B=$>~$9$k$J$I$N9)IW$r$7$F$*$/I,MW$,$"$j$^$9!#(B

$B%5%$%:$,5pBg$G$"$C$?$j!"0l0U@-$r3NJ]$7$?$$$J$I$NM}M3$G!"%/%i%9$KBP$7$F@8@.$5$l$k%$%s%9%?%s%9$N8D?t$r@)8B$7$?$$>l9g$O!"(BSingleton $B%Q%?!<%s$NMxMQ$r8!F$$7$^$7$g$&!#(B

$B%-%c%C%7%e$NH(B

$B%*%V%8%'%/%H$r%W!<%k$9$k$?$a$K!"%3%l%/%7%g%s!&%U%l!<%`%o!<%/$N%/%i%9$rMxMQ$9$k$3$H$,$h$/$"$j$^$9!#$7$+$7!"D94|4V$K$o$?$k%3%l%/%7%g%s!&%/%i%9$N:FMxMQ$KH<$C$F!"%5%$%:$,5pBg$K$J$j!"%a%b%j$r05Gw$9$kJ@32$,$"$j$^$9!#0lHL$K!"%5%$%:$,<+F0E*$K3HBg$9$k%*%V%8%'%/%H$O!"(BGC $B$K$h$C$F2s<}$5$l$k$^$G!"%5%$%:$r=L>.!J%7%e%j%s%/!K$9$k;EAH$_$rHw$($F$$$J$$$+$i$G$9!#$3$l$r2r7h$9$k$?$a$K$O!"4IM}%m%8%C%/$rAH$_9~$`I,MW$,$"$j$^$9$,!"H(B (java.lang.ref.WeakReference) $B$rMxMQ$9$k$3$H$,$G$-$^$9!#(B

SDK 1.2 $B$N%3%"!&%Q%C%1!<%8$K$O!"%*%V%8%'%/%H$N;2>H6/EY$rCJ3,E*$KI=8=$9$k%Q%C%1!<%8$G$"$k!"(Bjava.lang.ref $B$,F3F~$5$l$^$7$?!#;2>H6/EY$H$O!"(BGC $B$N2s<}BP>]$K$J$kCJ3,$rI=8=$9$k$b$N$G$9!#(B

$B6/2DE~C#(B (strongly reachable)
$BDL>o$N;2>H$GH$,B8:_$9$k!#(B
$B%=%U%H2DE~C#(B (softly reachable)
$B%/%i%9(B SoftReference $B7?$N%*%V%8%'%/%H$G/$J$/$J$k$3$H$K$h$C$F!";2>H$,GK4~$5$l$F(B GC $B$N2s<}BP>]$K$J$k2DG=@-$r;}$D!#%a%b%j$,2rJ|$5$l$k$H!";2>H$,(B ReferenceQueue $B$KDI2C$5$l$k!#(B"nice to have" $B$J%-%c%C%7%e$N
$B
$B%/%i%9(B WeakReference $B7?$N%*%V%8%'%/%H$G/$J$/$J$j(B GC $B$,5/F0$9$k$H!";2>H$,GK4~$5$l$F(B GC $B$N2s<}BP>]$K$J$k!#%a%b%j$,2rJ|$5$l$k$H!";2>H$,(B ReferenceQueue $B$KDI2C$5$l$k!#%R!<%W$H$7$F3d$j?6$j2DG=$J%a%b%j!&%5%$%:$r05Gw$9$k2DG=@-$,$"$C$?$j!"%+%N%K%+%kI=8=$r
$B%U%!%s%H%`2DE~C#(B (phantom reachable)
$B%/%i%9(B PhantomReference $B7?$N%*%V%8%'%/%H$G$N;2>H$H$O0[$J$j!"%a%b%jNN0h$,ReferenceQueue $B$KDI2C$5$l!"Ev3:$N;2>H$rDL$8$F!"=*N;=hM}$r;\$9$3$H$,2DG=!#(B

$B%/%i%9(B java.lang.ref.Reference $B$r7Q>5$9$k$3$l$i$N%/%i%9$N;2>H6/EY$r!"%a%b%j$N2rJ|$,CY$$=g=x$GJB$Y$k$H!"(B PhantomReference > SoftReference > WeakReference $B$K$J$j$^$9!#$3$3$G$O!"H$NMxMQNc$H$7$F!"(BWeakedHashMap $B7?%*%V%8%'%/%H$r!"%+%N%K%+%kI=8=$N%^%C%Q!<$H$7$FMxMQ$9$kNc$r5s$2$^$9!#%5%s%W%k$N%3!<%I$KL\$rDL$7$F$$$?$@$1$l$P!"$9$0$K$*J,$+$j$K$J$kDL$j!"%+%N%K%+%kI=8=$N

$B;2>H(B Reference $B$O!"(BReferenceQueue $B%/%i%9$N%$%s%9%?%s%9$H6&$KMxMQ$5$l$k$N$,0lHLE*$G$9!#(BWeakReference $B$OE~C#2DG=@-$,JQ99$5$l$k$H!"(BGC $B$K$h$C$FEPO?$5$l$k%-%e!<$rH$,(B GC $B$K2s<}$5$l$?$3$H$rDLCN$7$^$9!#(BWeakReference $B$N>l9g$O!"(BReferenceQueue $B$KEPO?$5$l$k$h$&$K$9$k$+$I$&$+$OG$0U$G$9!#EPO?$9$k>l9g$O!"%3%s%9%H%i%/%?$N0z?t$H$7$F!";2>HBP>](B (referent) $B$H$J$k%*%V%8%'%/%H6&$K;XDj$7$^$9!#(Breferent $B$,(B null $B$K$J$k$H!"(BWeakReference $B7?%*%V%8%'%/%H$O!"EPO?$5$l$F$$$k(B queue $B$K%(%s%-%e!<$5$l$^$9!#(B

// $B;2>H%-%e!<(B
ReferenceQueue queue = new ReferenceQueue();
// $B;2>HBP>](B
Object referent = new MyClass();
// $BH(B
WeakReference wref = new WeakReference(referent, queue)

$B%3%l%/%7%g%s!&%U%l!<%`%o!<%/$NCf$G!"(Bjava.util.WeakHashMap $B$O!"%$%s%?%U%'!<%9(B java.util.Map $B$N

$B$[$+$N(B Map $BMap $B7?%*%V%8%'%/%H$+$iD>@\;2>H$5$l$F$*$j!"%-!<$KBP$9$kL@<(E*$J;2>H$,$J$/$J$C$F$b!"%a%=%C%I(B remove() $B$d(B clear() $B$GL@<(E*$KGK4~$5$l$J$$8B$j!"Ev3:(B Map $B%*%V%8%'%/%H<+?H$,GK4~$5$l$k$^$G@8B8$7B3$1$^$9!#(B

$B0lJ}!"(BWeakHashMap $B7?%*%V%8%'%/%H$N>l9g!"%-!<$O(B WeakReference $B7?%*%V%8%'%/%H$N;2>HBP>]$H$7$FB8:_$7!"(BWeakHashMap $B7?%*%V%8%'%/%H$+$iD>@\E*$K$G$O$J$/H$5$l$F$$$^$9!#$=$N7k2L!"(BWeakHashMap $B7?%*%V%8%'%/%H$,@8B8$7$F$$$k4V$G$b!"%a%b%j;HMQN($NJQ2=$K1~$8$F!"%-!<$O$$$D$G$b(B GC $B$N2s<}BP>]$K$J$k2DG=@-$,$"$j$^$9!#(B

$BCM$K$D$$$F$b%-!<$,2s<}$5$l$k$H0l=o$K2s<}$5$l$^$9!#(BWeakHashMap $B$K8B$i$:!"0lHL$K(B Map $B7?%*%V%8%'%/%H$G$O!"%-!<$,(B null $B$K$J$k$H!"BP1~$9$kCM$bGQ4~BP>]$H$J$j$^$9!#(B

SDK 1.4 $B$G$O!"(BWeakHashMap $B%/%i%9$O!"3JG<$9$kMWAG$G$"$k(B Entry $B7?%*%V%8%'%/%H$r

 
private static class Entry extends WeakReference implements Map.Entry {
    private Object value;
    private final int hash;
    private Entry next;
    Entry(Object key, Object value, ReferenceQueue queue, int hash, Entry next) { 
        super(key, queue); 
        this.value = value;
        this.hash  = hash;
        this.next  = next;
    }
...
}

$B0lJ}!"(BHashMap $B%/%i%9$G$O!"

static class Entry implements Map.Entry {
    final Object key;
    Object value;
    final int hash;
    Entry next;
    Entry(int h, Object k, Object v, Entry n) { 
        value = v; 
        next = n;
        key = k;
        hash = h;
    }
...
}

$BAPJ}$rHf$Y$k$H!"(BHashMap $B$G$O!"(Bvalue $B$H(B key $B$NN>J}$H$bD>@\;2>H$7$F$$$k$3$H$,J,$+$j$^$9$,!"(BWeakHashMap $B$G$O!"(Bvalue $B$OD>@\;2>H$7$F$$$^$9$,!"(Bkey $B$O(B WeakReference $B$r7PM3$7$?4V@\;2>H$K$J$C$F$$$k$3$H$,J,$+$j$^$9!#(B

$BMyClassManager $B$r!"(BWeakHashMap $B$G=q$-49$($?$b$N$G$9!#(B

import java.util.WeakHashMap;
class MyClassManager {
    private WeakHashMap pool;
    
    // $B%3%s%9%H%i%/%?(B
    public MyClassManager(int size) {
        pool = new WeakHashMap(size);
    }
    // MyClass$B%*%V%8%'%/%H$Nl9g(B
        if (pool.containsKey(name)) {
            return (MyClass)pool.get(name);
        }
        // $BB8:_$7$J$$>l9g$O?75,DI2C(B
        pool.put(name, new MyClass(name));
        return (MyClass)pool.get(name);
    }
}

$B$3$NNc$G$O!"(Bpool $B$,(B WeakHashMap $B7?%*%V%8%'%/%H$G!"%-!<$K(B name$B!"CM$K(B MyClass $B7?%*%V%8%'%/%H$rJ];}$7$F$$$^$9!#%-!<$O(B WeakReference $B$N%$%s%9%?%s%9$J$N$G!"%a%b%j$,I/Gw$9$k$H(B GC $B$K$h$C$F2s<}$5$l$k2DG=@-$,$"$j$^$9$,!"2s<}$5$l$F$J$/$J$C$F$7$^$C$F$b!"getMyClass() $B5/F0;~$K?75,$KDI2C$7D>$9$3$H$K$J$k$N$G!"LdBj$O@8$8$^$;$s!#$=$N$H$-$K$O!"%*%V%8%'%/%H$N@8@.Ii2Y$,3]$+$k$3$H$K$J$j$^$9$,!"(BOutOfMemoryError $B$NH/@8$K$h$j!"%7%9%F%`A4BN$K1F6A$r5Z$\$9$h$j$bMZ$+$K%^%7$G$7$g$&!#$^$5$K!"%-%c%C%7%e$N$h$&$JF/$-$r$7$F$/$l$k$N$G$9!#(B

$B%*%V%8%'%/%H$r%W!<%k$9$k$H$-$K!"4IM}$9$k%3%l%/%7%g%s!&%*%V%8%'%/%H$,5pBg$K$J$k>l9g$O!"4IM}BP>]$N%*%V%8%'%/%H$rH$GJ];}$G$-$J$$$+8!F$$7$^$7$g$&!#(B

$B%3%l%/%7%g%s!&%/%i%9(B $B$K$D$$$F$N>\:Y$O!"K\9F$N(B$B%3%"%Q%C%1!<%8(B$B$N@bL@$r;2>H$/$@$5!#(B

$BBUBF$J=i4|2=(B

static $B%U%#!<%k%I$O%/%i%9$N%m!<%I;~$K!"$?$@0l2s$@$1=i4|2=$5$l$k$H=R$Y$^$7$?!#5U$K8@$&$H!"%/%i%9$,%m!<%I$5$l$k$H!"(B static $B%U%#!<%k%I$O=i4|2=$5$l$^$9!#(B

$B9M$(J}$H$7$F!"K\3JE*$K2TF0$7$F%H%i%U%#%C%/$,A}$($F$$$k$+$b$7$l$J$$8e$G=i4|2=$NIi2Y$r3]$1$k$h$j$b!"(B JVM $B5/F08e$N=i4|$K=i4|2=$7$?$?J}$,K>$^$7$$$+$b$7$l$^$;$s!#0lJ}$G!"$=$N$h$&$JL@3N$JMW7o$,$J$$>l9g$O!"I,MW$K$J$C$?$i=i4|2=$9$k$H$$$&!"BUBF$J9M$(J}$NJ}$,%Q%U%)!<%^%s%9>e$NMxF@$,9b$$$3$H$,!"7P83E*$KCN$i$l$F$$$^$9!#BUBF$J@_7W$r!"(Blazyu design $B$H8F$S!"%/%i%9$N%m!<%I$rCY$i$;$k$3$H$r!"(Blazy loading $B$H8F$S$^$9!#(B

$B%+%N%K%+%k2=%^%C%W$d%*%V%8%'%/%H!&%W!<%k$r=i4|2=$9$k>l9g!"BUBF$J=i4|2=$,9%$^$7$$>l9g$,$"$j$^$9!#(Bstatic $B%U%#!<%k%I$N$h$&$K!"%/%i%9$N%m!<%I;~$K<+F0E*$K=i4|2=$5$l$k$3$H$rHr$1$kBUBF$JJ}:v$H$7$F!"FbIt%/%i%9$r

$BBUBF$J

$BO@$h$j>Z5r$G!"4JC1$J%3!<%I$r<($7$^$9!#

lass MyClassManager {
    private MyClassManager();
    private static class SingletonOnlyOne() {
    	static final MyClassManager manager = mew myClassManager();
    }
    public static MyClassManager() {
        return SingletonOnlyOne.
    }
    
}


Copyright © 2003 SUGAI, Manabu. All Rights Reserved.
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送