Revised: 06th/Dec./2003; Since: Oct./14th/2003
$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%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=$r
$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 $B0lHL$K!"%a%=%C%I(B Flyweight $B%Q%?!<%s$r;H$C$F!"%+%N%K%+%i%$%
$B%W!<%k$5$l$k%*%V%8%'%/%H$N%/%i%9!'(B $B%+%N%K%+%k2=%^%C%W!'(B $B%+%N%K%+%k2=%^%C%W$G$"$k(B $B%+%N%K%+%k2=%^%C%W$N%/%i%$%"%s%H!&%3!<%I!'(B 10 $B2s7+$jJV$9%k!<%WFb$G!"%*%V%8%'%/%H$N@8@.$r9T$C$F$$$^$9!#(B $B$b$7!"(B $B $B3N$+$K!"(B5 $B $B$3$NNc$G$O!"G[Ns(B $B$3$3$GNc$K5s$2$?$h$&$K!"%*%V%8%'%/%H$N 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$$ $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<+ 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!" Singleton $B%Q%?!<%s$N%]%$%s%H$O!"%3%s%9%H%i%/%?$r(B $B%3%s%9%H%i%/%?$b%U%#!<%k%I$b(B $B%/%i%$%"%s%HB&$G$O!"(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!"(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%*%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$,!" 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!"(B $B%/%i%9(B $B;2>H(B $B%3%l%/%7%g%s!&%U%l!<%`%o!<%/$NCf$G!"(B $B$[$+$N(B $B0lJ}!"(B $BCM$K$D$$$F$b%-!<$,2s<}$5$l$k$H0l=o$K2s<}$5$l$^$9!#(B SDK 1.4 $B$G$O!"(B $B0lJ}!"(B $BAPJ}$rHf$Y$k$H!"(B $BMyClassManager $B$r!"(B $B$3$NNc$G$O!"(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$r $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 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!#
$B%+%N%K%+%k2=%^%C%W(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%$%
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$N
MyClass
$B7?%*%V%8%'%/%H$r!"FbIt$N(B MyClass
$B7?G[Ns(B pool[]
$B$GJ];}$7$^$9!#(BgetMyClass()
$B$N0z?t$NJ8;zNs$H!"%W!<%kFb$N%*%V%8%'%/%H$rHf$Y$F!"(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$N
MyClassManager
$B$rMxMQ$9$k%/%i%$%"%s%H$O!"
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!#(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 $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
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$NgetMyClass()
$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$NHashMap
$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!#(Bequals()
$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
pool[]
$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;
}
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];
}
}
pool[i]
$B$G
// ...$B>JN,(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%$%s%9%?%s%9?t$N@)8B!'(BSingleton$B%Q%?!<%s(B
private
, static
$B=$>~$7$F!"%$%s%9%?%s%9$O%a%=%C%I(B getter
$B$G
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
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!#(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!#(Bpool
$B$K@8@.$9$k%*%V%8%'%/%H$Nsyncronized
$B=$>~$9$k$J$I$N9)IW$r$7$F$*$/I,MW$,$"$j$^$9!#(B$B%-%c%C%7%e$N
java.lang.ref.WeakReference
) $B$rMxMQ$9$k$3$H$,$G$-$^$9!#(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
SoftReference
$B7?$N%*%V%8%'%/%H$GReferenceQueue
$B$KDI2C$5$l$k!#(B"nice to have" $B$J%-%c%C%7%e$NWeakReference
$B7?$N%*%V%8%'%/%H$GReferenceQueue
$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=$rPhantomReference
$B7?$N%*%V%8%'%/%H$Gjava.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!"WeakedHashMap
$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=$NReference
$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!<$rWeakReference
$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();
// $B
java.util.WeakHashMap
$B$O!"%$%s%?%U%'!<%9(B java.util.Map
$B$NMap
$Bremove()
$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!#(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$/WeakHashMap
$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!#(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!#(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;
}
...
}
HashMap
$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;
}
...
}
HashMap
$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!#(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$N
pool
$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$BBUBF$J=i4|2=(B
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] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送