http://cr.openjdk.java.net/~briangoetz/valhalla/sov/02-object-model.html
ã»ã¯ã·ã§ã³2ïŒèšèªã¢ãã«
Brian Goetz, Dec 2019
ãã®ããã¥ã¡ã³ãã¯ãã€ã³ã©ã€ã³åãçµã¿èŸŒãããã®èšèªã¢ãã«ã«ã€ããŠèª¬æããŸãã ã€ã³ã©ã€ã³åã®JVMã¢ãã«ãããã³JavaãœãŒã¹ã³ãŒãããJavaã¯ã©ã¹ãã¡ã€ã«ãžã®å€ææŠç¥ã«ã€ããŠã¯ãå¥ã®ããã¥ã¡ã³ãã§èª¬æããäºå®ã§ãã ïŒãã®ããã¥ã¡ã³ãã§ã¯ããçŸåšããšããèšèãããã®èšèªã®ä»ã®ç¶æ³ãããªãã¡ã€ã³ã©ã€ã³åããªãç¶æ ãæããã®ãšããŠäœ¿ããŸããïŒ
çŸåšãåã¯ããªããã£ãåãšåç
§åã«åããããŠããŸãã
8ã€ã®çµã¿èŸŒã¿ããªããã£ãåããããŸãïŒvoid
ã¯åã§ã¯ãããŸããïŒã
åç
§åãšã¯ãããªããã£ãåã§ã¯ãªãåã§ãã¯ã©ã¹ãŸãã¯ã€ã³ã¿ãŒãã§ãŒã¹ãšããŠå®£èšãããåãšã
é
ååïŒString[]
, int[]
ïŒããã³åç
§åã®ãã©ã¡ãŒã¿ãŒåïŒList<String>
, List<?>
ïŒãªã©ã®é宣èšåãå«ãã§ããŸãã
åç
§åãšããªããã£ãåã¯ãèããããã»ãšãã©ãã¹ãŠã®ç¹ã§ç°ãªããŸãã
åç
§åã¯ã¡ã³ããŒïŒã¡ãœãããšãã£ãŒã«ãïŒãšã¹ãŒããŒã¿ã€ãïŒã¹ãŒããŒã¯ã©ã¹ãšã€ã³ã¿ãŒãã§ãŒã¹ïŒãæã¡ããã¹ãŠãïŒçŽæ¥ãŸãã¯éæ¥çã«ïŒObject
ãæ¡åŒµããŸãã
ããªããã£ãåã«ã¯ã¡ã³ããŒããªããåã·ã¹ãã äžã®ãå€å³¶ãã§ãããã¹ãŒããŒã¿ã€ãããµãã¿ã€ãã¯ãããŸããã
ããªããã£ãåãåç
§åã«æ¥ç¶ããããã«ãåããªããã£ãåã¯ã©ãããŒåã«é¢é£ä»ããããŠããŸãïŒInteger
ã¯int
ã®ã©ãããŒåã§ãïŒã
ã©ãããŒåã¯åç
§åã§ãããããã¡ã³ããŒãæã€ããšãã§ãããµãã¿ã€ãã³ã°ã«åå ã§ããŸãã
ããªããã£ãåãšããã«å¯Ÿå¿ããã©ãããŒåã®éã«ã¯ããã¯ã·ã³ã°ãšã¢ã³ãã¯ã·ã³ã°ã®å€æããããŸãã
ãã¹ãŠã®åã¯å€éåãæã¡ãŸããããã¯ããã®åã®å€æ°ã«æ ŒçŽã§ããå€ã®éåã§ãã
ïŒããšãã°ãint
ã®ãããªããªããã£ãã®å€éåã¯32ãããæŽæ°ã®éåã§ããïŒ
åT
ã®å€éåãè¡šãããã«ãVals(T) ãšèšè¿°ããããšã«ããŸãã
åT
ãåU
ã®ãµãã¿ã€ãã§ããå ŽåãVals(T)âââVals(U) ã§ãã
ãªããžã§ã¯ã ã¯ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã§ãã çŸåšããã¹ãŠã®ãªããžã§ã¯ãã«ã¯äžæã® ãªããžã§ã¯ãã¢ã€ãã³ãã£ã㣠ããããŸãã
åç
§åã®å€éå㯠ãªããžã§ã¯ã ã§ã¯ãªãã ãªããžã§ã¯ããžã®åç
§ ã§æ§æãããŸãã
String
åã®å€æ°ããšãããå€ã¯ã String
ãªããžã§ã¯ãèªäœã§ã¯ãªãããããã®String
ãªããžã§ã¯ããžã®åç
§ã§ãã
ïŒçµéšè±å¯ãªJavaéçºè
ã§ããããªããžã§ã¯ããçŽæ¥ä¿åãæäœããŸãã¯ã¢ã¯ã»ã¹ã§ããªãããšã«é©ããããããŸããã
ç§ãã¡ã¯ãªããžã§ã¯ãåç
§ãæ±ãããšã«æ
£ããããŠããã®ã§ãéãã«æ°ä»ããªãããšãããããŸãã
å®éãJavaãªããžã§ã¯ããå€æž¡ããããã®ãåç
§æž¡ããããã®ãããšããã®ã¯ãããããèœãšãç©Žãã®è³ªåã§ãããçãã¯ãã©ã¡ãã§ããªããã§ãã
ãªããžã§ã¯ãåç
§ ãå€æž¡ããããŸããïŒ
ããªããã£ãåã®å€éåã¯ãããªããã£ãå€ã§æ§æãããŸãïŒnullã¯å«ãŸããŸããïŒã
åç §åã®å€éåã¯ããªããžã§ã¯ãã€ã³ã¹ã¿ã³ã¹ãžã®åç §ããŸãã¯nullã§æ§æãããŸãã
åã®æ®µèœã®ïŒã€ã®éèŠãªäºå®ïŒãã¹ãŠã®ãªããžã§ã¯ãã«ã¯äžæã®ã¢ã€ãã³ãã£ãã£ãããããªããžã§ã¯ããæäœããå¯äžã®æ¹æ³ã¯åç §ãä»ããããšïŒã¯äž¡æ¹ãšããã€ã³ã©ã€ã³åãåã蟌ããšå€ãããŸãã
次ã®å³ã§ã¯ãJavaããã°ã©ã ã®å€æ°ã«æ ŒçŽã§ããå€ã匷調衚瀺ããããã«ãè¡šçŸå¯èœãªå€ãèµ€ãããã¯ã¹ã§ç€ºããŸãã
çŸåšã®äžçã«ãããå€ã®å®å®ã¯ãããªããã£ãå€ãšãªããžã§ã¯ããžã®åç §ã§æ§æãããŠããŸãã
çŸåšã®äžçãèŠçŽãããšã以äžã®éãã§ãã
- åã¯ãããªããã£ãåãšåç §åã«åãããŠããŸãã
- åç §åã¯ãããªããã£ãåã§ã¯ãªãã宣èšãããã¯ã©ã¹ã宣èšãããã€ã³ã¿ãŒãã§ãŒã¹ãããã³é ååãå«ã¿ãŸãã
- ããªããã£ãã«ã¯å¯Ÿå¿ããã©ãããŒåãããããããŠããã¯åç §åã§ãããããªããã£ãåãšããã«å¯Ÿå¿ããã©ãããŒã®éã«ã¯ãã¯ã·ã³ã°ããã³ã¢ã³ãã¯ã·ã³ã°ã®å€æããããŸãã
- ããªããã£ãåã®å€éåã«
null
ãå«ãŸããããšã¯ãããŸããã - åç
§åã®å€éåã¯ãªããžã§ã¯ãã§ã¯ãªããªããžã§ã¯ããžã® åç
§ ã§æ§æãããåžžã«
null
ãå«ãŸããŸãã - ãªããžã§ã¯ãã«ã¯ãªããžã§ã¯ãã¢ã€ãã³ãã£ãã£ããããŸãã
æºåãæŽããŸããã®ã§ãèšèªåã·ã¹ãã ã®äžã§ã€ã³ã©ã€ã³ã¯ã©ã¹ãã©ã®ããã«å容ãããã«åãçµã¿ãŸãããã ã€ã³ã©ã€ã³ã¯ã©ã¹ã®ã¢ãããŒã¯ã*ãã¯ã©ã¹ã®ããã«ã³ãŒããæžããintã®ããã«åäœããã*ã§ãã ãã®ã¢ãããŒã®åŸåã®éšåã¯ãã€ã³ã©ã€ã³åããããŸã§ã«èª¬æããããªããã£ãåã®å®è¡æã®åäœãšäžèŽããªããã°ãªããªãããšãæå³ããŠããŸãã (å®éãç§ãã¡ã¯ããªããã£ãåãã€ã³ã©ã€ã³åã®åäžã«å ¥ããããšèããŠããŸãããã§ã«äºåå²ãããŠããåã·ã¹ãã ãããå€ãã®ã«ããŽãªã«åå²ããããšã¯æãŸãããããŸãã)ã
ã€ã³ã©ã€ã³ã¯ã©ã¹ã¯ã¯ã©ã¹ã®ããã«ã³ãŒããæžããããã¯ã©ã¹ãæã€ããšãã§ããã»ãšãã©ã®ãã®ãæã€ããšãã§ããŸãïŒãã£ãŒã«ããã¡ãœãããã³ã³ã¹ãã©ã¯ã¿ãŒãã¹ãŒããŒã€ã³ã¿ãŒãã§ãŒã¹ãåå€æ°ãªã©ã§ãã
inline class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int x() { return x; }
public int y() { return y; }
}
Valhallaãããããæåã®å€§ããªéãã¯ãã€ã³ã©ã€ã³ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ïŒããã ã€ã³ã©ã€ã³ãªããžã§ã¯ã ãšåŒã³ãŸãïŒã«ã¢ã€ãã³ãã£ãã£ããªãããšã§ãã ããã¯ãã¢ã€ãã³ãã£ãã£ã«äŸåããç¹å®ã®æäœïŒåæãªã©ïŒãã€ã³ã©ã€ã³ãªããžã§ã¯ãã§ã¯èš±å¯ãããªãããšãæå³ããŸãã æ··ä¹±ãé¿ããããã«ãåŸæ¥ã®ã¯ã©ã¹ã ã¢ã€ãã³ãã£ãã£ã¯ã©ã¹ ãšåŒã³ããããã®ã€ã³ã¹ã¿ã³ã¹ã ã¢ã€ãã³ãã£ãã£ãªããžã§ã¯ã ãšåŒã³ãŸãã
ã€ã³ã©ã€ã³ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã¯ãªããžã§ã¯ãã§ãããã¢ã€ãã³ãã£ãã£ã¯ãããŸããã
ãªããžã§ã¯ãã® ID ã¯ããšãããã å¯å€æ§ ãš ã¬ã€ã¢ãŠãã®ããªã¢ãŒãã£ãºã ãå¯èœã«ãã圹å²ãæãããŸãã
ID ãæŸæ£ããããšã§ãã€ã³ã©ã€ã³ã»ã¯ã©ã¹ã¯ããããæŸæ£ããªããã°ãªããŸããã
ãããã£ãŠãã€ã³ã©ã€ã³ã»ã¯ã©ã¹ã¯æé»çã« final
ã§ããã®ãã£ãŒã«ãã¯æé»çã« final
ã§ããã®ã¹ãŒããŒã¿ã€ãã«ã¯å¶éããããŸãã
ïŒãããã¯ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããããããã€ãã®æœè±¡ã¯ã©ã¹ãæ¡åŒµãããããããšãã§ããŸããïŒ
ããã«ãã€ã³ã©ã€ã³ã¯ã©ã¹ V
ã®è¡šçŸã¯ãçŽæ¥çã«ãéæ¥çã«ãã V
åã®ãã£ãŒã«ããå«ãã§ã¯ãããŸããã
ïŒããããã€ã³ã©ã€ã³ã¯ã©ã¹ã¯ clone()
ã¡ãœããã finalize()
ã¡ãœããããªãŒããŒã©ã€ãããããšã¯ã§ããŸãããïŒ
Valhallaã§ã¯ãåãããªããã£ãåãšåç §åã«åããã®ã§ã¯ãªããã€ã³ã©ã€ã³åãšåç §åã«åããŠããŸãã ããã§ã€ã³ã©ã€ã³åã¯ããªããã£ããå å«ããŸãã ãåç §åãã®æå³ã¯åºå®ããããŸãŸã§ãïŒåç §åã¯ã€ã³ã©ã€ã³åã§ã¯ãªããã®ã§ãã ããã«ã¯ã宣èšããã ID ã¯ã©ã¹ã宣èšãããã€ã³ã¿ãŒãã§ã€ã¹ãé ååãªã©ãå«ãŸããŸãã åã«ã€ããŠã®å³ãæŽæ°ããŠãã€ã³ã©ã€ã³åãå«ãããã«ããŠã¿ãŸãããã
å€éåããªããžã§ã¯ãã€ã³ã¹ã¿ã³ã¹ãžã® åç
§ ã§æ§æãããã¢ã€ãã³ãã£ãã£ã¯ã©ã¹ïŒãŸã㯠null
ïŒãšã¯ç°ãªããã€ã³ã©ã€ã³ã¯ã©ã¹åã®å€éåã¯ããã®ã¯ã©ã¹ã®å¯èœãª ã€ã³ã¹ã¿ã³ã¹ ã®éåã§ãïŒããªããã£ããšåæ§ã«ãã€ã³ã©ã€ã³ã¯ã©ã¹ã¯ nulläžå¯ ã§ãïŒã
ã€ã³ã©ã€ã³ãªããžã§ã¯ãã¯ãçŸåšã®ããªããã£ããšåæ§ã«çŽæ¥è¡šçŸãããŸãããã®ããšãå€éåã®å³ã«åæ ããŸãããã
ããªããã£ããšåæ§ã«ãã€ã³ã©ã€ã³ã¯ã©ã¹ã®å€éåã¯ããªããžã§ã¯ãåç §ã§ã¯ãªãããã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã®éåã§ãã
ãã¹ãŠã®å㯠ããã©ã«ãå€ ãæã¡ãŸãã
ããªããã£ãåã®å Žåãããã©ã«ãå€ã¯ããçš®ã®ãŒãïŒ0
, 0.0
, false
ãªã©ïŒã§ãã åç
§åã®å Žåãããã©ã«ãå€ã¯nullã§ãã
ã€ã³ã©ã€ã³ã¯ã©ã¹ã®å Žåãããã©ã«ãå€ã¯ãã®åã®ã€ã³ã¹ã¿ã³ã¹ã®ãã¡ããã¹ãŠã®ãã£ãŒã«ããããããã®åã®ããã©ã«ãå€ãåããã®ã§ãã
ã¯ã©ã¹å C
ã®å Žåã C
ã®ããã©ã«ãå€ã C.default
ãšèšèŒããã§ãããã
ïŒãžã§ããªãã¯ãªã³ãŒãã§ã¯ã T.default
ãšèšèŒããã§ããããåæ¶å»ã«ãããžã§ããªã¯ã¹ã®å Žåã T
ã¯åžžã«åç
§åã§ããããããã㯠null
ãšè©äŸ¡ãããŸãã
ãžã§ããªã¯ã¹ãç¹æ®åãããå Žåã¯ãT.default
ãç¹æ®åãããŸããïŒ
ã³ã³ãã€ã«æãšå®è¡æã«ã€ã³ã©ã€ã³ã¯ã©ã¹ãšã¢ã€ãã³ãã£ãã£ã¯ã©ã¹ãåºå¥ããããã«ã å¶çŽä»ãã€ã³ã¿ãŒãã§ãŒã¹ã®ãã¢ã§ããIdentityObject
ãšInlineObject
ãå°å
¥ããŸãã
ã€ã³ã©ã€ã³ã¯ã©ã¹ã¯æé»çã«InlineObject
ãå®è£
ããŸããã¢ã€ãã³ãã£ãã£ã¯ã©ã¹ã¯æé»çã«IdentityObject
ãå®è£
ããŸããïŒäž¡æ¹ãå®è£
ããããšãããšãšã©ãŒã«ãªããŸããïŒ
ããã«ãããã¢ã€ãã³ãã£ãã£ã«äŸåããæäœãå®è¡ããåã«ãªããžã§ã¯ãã®ã¢ã€ãã³ãã£ãã£ãåçã«ãã¹ãããã³ãŒããäœæã§ããŸãã
if (x instanceof IdentityObject)) {
synchronized(x) { ... }
}
åæ§ã«ãå¯å€åïŒããã³ãžã§ããªãã¯åã®å¢çïŒã§ã®åäžæ§ã®èŠæ±ãéçã«åæ ããŠããŸãã
static void runWithLock(IdentityObject lock, Runnable r) {
synchronized (lock) {
r.run();
}
}
çŸåšã®äžçã§ã¯ãããªããã£ãåããšã« ==
ãå®çŸ©ãããŠãããåç
§åã§ã¯ã2ã€ã®å€ã ==
ãšãªãã®ã¯ãäž¡æ¹ãnullã§ããããåããªããžã§ã¯ããžã®åç
§ã§ããå Žåã§ãã
çŸåšããã¹ãŠã®åç
§ã¯ã¢ã€ãã³ãã£ãã£ãæã€ãªããžã§ã¯ããæããŠããããããªããžã§ã¯ãã¢ã€ãã³ãã£ãã£ã䜿çšããŠãåããªããžã§ã¯ãããå®çŸ©ã§ããŸãã
ã³ã³ããžã·ã§ã³ãçšã㊠==
ãã€ã³ã©ã€ã³ãªããžã§ã¯ãã«æ¡åŒµã§ããŸãã
2ã€ã®ã€ã³ã©ã€ã³ãªããžã§ã¯ãã ==
ãšãªãã®ã¯ã2ã€ãåãåã§ãããããã®ãã£ãŒã«ãã«ã€ããŠãå
šãŠã®ãã¢ããã£ãŒã«ãã®éçåã® ==
ã«åŸã£ãŠçããå Žåã§ã
ïŒ float
ããã³ double
ãé€ããŸãããããã¯ã Float::equals
ããã³ Double::equals
ã®ã»ãã³ãã£ã¯ã¹ã«åŸã£ãŠæ¯èŒãããŸãïŒã
ãã®å®çŸ©ã§ã¯ã2ã€ã®ã€ã³ã©ã€ã³ãªããžã§ã¯ãã 眮æå¯èœ ãããªãã¡éããèå¥ã§ããªãå Žåã«ã®ã¿çå€ã§ãããšèšããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹ I
ãå®è£
ããä»»æã®ã¯ã©ã¹ X
ïŒã€ã³ã©ã€ã³ãŸãã¯ã¢ã€ãã³ãã£ãã£ïŒã®å Žåã X
ã®é
åã«å¯ŸããŠæ¬¡ã®ãµãã¿ã€ãé¢ä¿ãä¿æãããŸãã
X[] <: I[] <: Object[]
çŸåšãããã€ãã®æäœã¯ãªããžã§ã¯ãã¢ã€ãã³ãã£ãã£ã®èŠ³ç¹ããå®çŸ©ãããŠããŸãã ãããã®äžéšã¯ããã¹ãŠã®ãªããžã§ã¯ãã€ã³ã¹ã¿ã³ã¹ã察象ãšããããã«é©åã«æ¡åŒµã§ããŸãã æ®ãã®æäœã¯éšåçã«ãªããŸãã ãããã«ã¯ä»¥äžãå«ãŸããŸãã
- çå€æ§ã
Object
äžã§==
ãå šååããŸãã ã€ãŸããçŸåšã«ãããŠæå³ãããå Žåãæ°ããå®çŸ©ã¯ãã®æå³ãšäžèŽããŸãã ïŒæ¬¡ã®ã»ã¯ã·ã§ã³ã§èª¬æããããã«ãã€ã³ã©ã€ã³ãªããžã§ã¯ã ãžã®åç § ã«é¢é£ããè¿œå ã®äœæ¥ãããã€ããããŸããïŒ - System::identityHashCodeã
identityHashCode
ã®äž»ãªçšéã¯ãIdentityHashMap
ãªã©ã®ããŒã¿æ§é ã®å®è£ ã§ãã çå€æ§ãå šååããã®ãšåãæ¹æ³ã§identityHashCode
ãå šååã§ããŸã - ãã¹ãŠã®ãã£ãŒã«ãã®ããã·ã¥ããã€ã³ã©ã€ã³ã»ãªããžã§ã¯ãã®ããã·ã¥ãå°åºããŸãã - åæã ããã¯éšåçãªæäœã«ãªããŸãã åæãå®è¡æã«å€±æããããšãéçã«æ€åºã§ããå ŽåïŒã€ã³ã©ã€ã³ã¯ã©ã¹ã§
synchronized
ã¡ãœããã宣èšãããªã©ïŒãã³ã³ãã€ã«ãšã©ãŒãçºè¡ã§ããŸãã ããã§ãªãå Žåãã€ã³ã©ã€ã³ã€ã³ã¹ã¿ã³ã¹ãããã¯ããããšãããšãå®è¡æã«IllegalMonitorStateException
ãšãªããŸãããããæ£åœåã§ããã®ã¯ã察象ãªããžã§ã¯ãã®ããã¯ãããã³ã«ãæ確ã«ç解ããŠããªãã®ã«ãããããã¯ãããšããã®ã¯æ¬è³ªçã«äžæ³šæã«ãããã®ã ããã§ããä»»æã®Object
ãŸãã¯ã€ã³ã¿ãŒãã§ãŒã¹ã€ã³ã¹ã¿ã³ã¹ãããã¯ãããšããã®ã¯ããŸãã«ããããããšãªã®ã§ãã - Object::wait ããã³ Object::notifyã åæãšåãã§ãã
- 匱ãåç
§ã ããã«ã€ããŠã¯ã©ã¡ãã«ããããšãã§ããŸãã
Object
ã®åŒ±åç §ãäœæããããšãéšååãã§ããŸãããããã¯åä»ãªçµæã«ãªããŸãïŒåŒ±åç §ã¯ã»ãšãã©åœ¹ã«ç«ããªããªããŸãããªããªããäœããã®åŒ±ãããŒã¿æ§é ãç¶æããããã¹ãŠã®ã¯ã©ã¹ã¯ãã¢ã€ãã³ãã£ãã£ãªããžã§ã¯ããšã€ã³ã©ã€ã³ãªããžã§ã¯ãã®å¥ã ã®ãã¹ã«åå²ããå¿ èŠãåºãŠããããã§ã ïŒããã¯identityHashCode
ã®éšååã«äŒŒãŠããŸãïŒãäžæ¹ãåçŽãªåäœïŒã€ã³ã©ã€ã³ãªããžã§ã¯ããä¿æãã匱åç §ã¯æ±ºããŠæ¶å»ãããªããªã©ïŒãéžæãããšãåãã¯ååšããŠããã匱åç §ã䜿çšããç®çãšãªãGCãã¬ã³ããªãŒãªæ¯ãèãã®äžéšã倱ãããŸãããã®ä»¶ã¯ãããªãåæãå¿ èŠã§ãã
ãããŸã§ã®ãšããããããã°ã©ã å¯èœãªããªããã£ããã«éåžžã«ãã䌌ãã€ã³ã©ã€ã³åãæ§ç¯ããŠããŸããã ããããããªããã£ãã®æ倧ã®æ¬ ç¹ã¯ãéçã«ãåçã«ããããªããã£ããšãªããžã§ã¯ãã®éã§ã¯ã£ããåãããŠããç¹ã§ãã ãããã°ã©ã å¯èœãªãéšåã¯ãã€ã³ã©ã€ã³åãã¡ã³ããŒãšã¹ãŒããŒã¿ã€ããæã€ããšãã§ãããšããç¹ã§ãããã€ãã®ã®ã£ãããçããŸãã ãããããã®ã®ã£ãããããã«çãããããšæããŸãã
çŸåšã®äžçã§ã¯ã ãã¯ã·ã³ã°å€æãä»ããŠããªããã£ãåããåç
§åã«å€æããŠããŸãã ããã¯ãããå€ãã®å€æ
çãªã³ãŒããæžãããšãã§ããã®ã§äŸ¿å©ã§ãã
ãµãã¿ã€ããŸãã¯ãã¯ã·ã³ã°ãä»ããŠãä»»æã®å€ã Object
ã§è¡šãããšãã§ããŸãã
ãããããã¯ã·ã³ã°ã«ã¯ããã€ãã®é倧ãªæ¬ ç¹ããããŸãã
ããã¯ã¹åã¯ãç¹æ³šã®æäœãã¯ã©ã¹ã§ãããããªããã£ãåãžã®èšèªçæ¥ç¶ã¯éãããŠããŸã - ããã¯ãã€ã³ã©ã€ã³ã¯ã©ã¹ã«ç¢ºå®ã«å¯Ÿå¿ããŸããã
ããã«æªãããšã«ãçµæã®ããã¯ã¹ã«ã¯ãå¶çºçãªããªããžã§ã¯ãã¢ã€ãã³ãã£ãã£ããããå€ãã®VMæé©åã®åŠšãã«ãªããŸãã
ããã¯ã·ã³ã°ã¯é
ãããšãã信念ã¯ããã®å¶ç¶ã®ã¢ã€ãã³ãã£ãã£ã«ç±æ¥ãããã®ã§ãã
ç§ãã¡ãããããã®ã¯ãå®è¡æã®ã¢ãããã¯ã§è»œéãªæ¹æ³ã§ã€ã³ã©ã€ã³åã®äžçãåç §åã®äžçã«æ¥ç¶ããããšã§ãã
ã€ã³ã©ã€ã³ã¯ã©ã¹ã®å€éåã¯ãªããžã§ã¯ãã€ã³ã¹ã¿ã³ã¹ã§æ§æãããŸãããã¢ã€ãã³ãã£ãã£ã¯ã©ã¹ã®å€éåã¯ãªããžã§ã¯ãã€ã³ã¹ã¿ã³ã¹ ãžã®åç § ã§æ§æãããŸãã ãã®è¡šçŸã®éãã¯ãçŸåšã®äžçã®ããªããã£ããšãªããžã§ã¯ãã®éãã®äž»ãªåå ã®1ã€ã§ãã
ã€ã³ã©ã€ã³ã¯ã©ã¹ãåã·ã¹ãã ã®æ®ãã®éšåã«æ¥ç¶ããã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ã㊠Object
ãæ¡åŒµã§ããããã«ããŸãã
ããããã€ã³ã¿ãŒãã§ãŒã¹ I
ã I
ãå®è£
ããã¢ã€ãã³ãã£ãã£ã¯ã©ã¹ C
ãããã³ I
ãå®è£
ããã€ã³ã©ã€ã³ã¯ã©ã¹ V
ããããšããŸãã
I
ã®å€éå㯠I
ã§ããïŒ æããã«ã C
ãš V
ã®äž¡æ¹ã®å€éåãå«ããå¿
èŠããããŸããããããã®éåã¯æ§é çã«ãŸã£ããç°ãªããŸãã
äžæ¹ã«ã¯ãªããžã§ã¯ããå«ãŸããããäžæ¹ã«ã¯ãªããžã§ã¯ããžã®åç
§ãå«ãŸããŸãã ããã¯ãæ©æž¡ãããå¿
èŠããããªããžã§ã¯ããšããªããã£ãã®åæã§ãã
çŸåšã®äžçã¯ããããäžåšçšã«ãã¯ã·ã³ã°ã§åããŠããŸãã ããåäžã§è»œéãªæ¹æ³ã§æ©æž¡ããããããšèããŠããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹ïŒããã³ Object
ïŒã¯åç
§åã§ããã€ãŸããå€éåã¯ãªããžã§ã¯ãåç
§ã§æ§æãããŠããå¿
èŠããããŸãã
ããããValhallaã®æ¬¡ã®å€§ããªéãã«ã€ãªãããŸãã
ããªãã¡ãã¢ã€ãã³ãã£ãã£ãªããžã§ã¯ããæäœã§ããã®ã¯åç
§ãä»ããŠã®ã¿ã§ãããã€ã³ã©ã€ã³ãªããžã§ã¯ãã§ã¯ãçŽæ¥ãŸãã¯ãªããžã§ã¯ãåç
§ãä»ããŠã ã©ã¡ãã®æ¹æ³ã§ã æäœããã³ä¿åã§ããŸãã
Valhallaã®å€ã®å®å®ã¯ãããªããã£ãå€ãã€ã³ã©ã€ã³ãªããžã§ã¯ããããã³ã¢ã€ãã³ãã£ãã£ãªããžã§ã¯ããšã€ã³ã©ã€ã³ãªããžã§ã¯ãã®äž¡æ¹ãžã®åç §ã§æ§æãããŠããŸãã
Valhallaã§ã¯ã ã€ã³ã©ã€ã³æ¡å€§å€æ ãä»ããŠã€ã³ã©ã€ã³ããåç
§åã«å€æããŸãã ããã¯ãã¯ã·ã³ã°ãšäŒŒãŠããŸããã倧ããªéãããããŸãïŒ
å€æã®çµæã¯ïŒããã¯ã¹ã®ããã«ïŒã¢ã€ãã³ãã£ãã£ãªããžã§ã¯ãã§ã¯ãªãã ã€ã³ã©ã€ã³ãªããžã§ã¯ããžã®åç
§ ã§ãã
ïŒçµæã® Object
㧠Object::getClass
ãåŒã³åºããšãããã¯ã¹åã§ã¯ãªããå
ã®ã€ã³ã©ã€ã³ãªããžã§ã¯ãã®ã¯ã©ã¹ãå ±åãããŸããïŒ
ããã«ãããVMã®æé©åèœåãæãªãããšãªããã€ã³ã©ã€ã³åãšåç
§åã®éã§å¿
èŠãªçžäºéçšãå¯èœã«ãªããŸãã
ã€ã³ã©ã€ã³æ¡å€§å€æã¯ããã¯ã·ã³ã°ã®ããã©ãŒãã³ã¹ã®æ¬ ç¹ãã»ãšãã©äŒŽããã«ããã¯ã·ã³ã°ã®æãŸããã»ãã³ãã£ã¯ã¹ãæäŸããŸãã
æŒç®å ref v ã¯ã v ãã€ã³ã©ã€ã³ãªããžã§ã¯ãã®å Žå㯠v ãžã®åç §ãšããŠå®çŸ©ãã v ãæ¢ã«ãªããžã§ã¯ãåç §ã§ããå Žå㯠v èªäœãšããŠå®çŸ©ãããšäŸ¿å©ã§ãã ããããã°ã ref ã¯ãã¹ãŠã®è¡šçŸå¯èœãªå€ã®å šåã§å®çŸ©ãããåžžã«åç §ãè¿ããŸãã ïŒéã®æŒç®å unref ã¯éšåçã§ãããã€ã³ã©ã€ã³ãªããžã§ã¯ããžã®åç §ã«ã®ã¿é©çšããã2ã€ã¯ å°åœ±ãšåã蟌ã¿ã®ã㢠ã圢æããŸããïŒ
ã€ã³ã©ã€ã³æ¡å€§å€æã¯ãã€ã³ã©ã€ã³åãããããå®è£
ããä»»æã®ã€ã³ã¿ãŒãã§ãŒã¹ããã³ Object
ã«ååšãã ref æŒç®åã®é©çšãšããŠå®çŸ©ãããŠããŸãã
ããã«ããã I
ã®å€éåã«é¢ãã質åã«çããããšãã§ããŸãã
ããã«ã¯ã C
ã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ãžã®åç
§ãšã V
ã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ãžã®åç
§ãå«ãŸããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹ïŒããã³
Object
ïŒã®å€éåã¯ãå€null
ã«å ããŠãã¢ã€ãã³ãã£ãã£ãŸãã¯ã€ã³ã©ã€ã³ãªããžã§ã¯ãã®ããããã§ãããªããžã§ã¯ããžã®åç §ã§æ§æãããŸãã ã€ã³ã¿ãŒãã§ãŒã¹ãŸãã¯Object
ã€ã³ã¹ã¿ã³ã¹ã§ã¢ã€ãã³ãã£ãã£ã«äŸåããæäœãå®è¡ãããšãå®è¡æã«å€±æããå ŽåããããŸãã
ãã®æç¹ã§ãèªè ã¯åã«çšèªã®ããªãã¯ãæŒããã ããå«æã®ããçšèªããã¯ã·ã³ã°ãããŸã å«æã®ãªãçšèªãã€ã³ã©ã€ã³æ¡å€§ãã«çœ®ãæããã ãã§ã¯ãªãããšçåã«æããããããŸããã å®æœããã®ãåã«ååã®å€æŽã ããªã®ã§ããã°ãããã¯ç¢ºãã«ããªãã¯ã«ãªããŸãã ã€ã³ã©ã€ã³æ¡å€§ãåã«ååå€æŽããããã¯ã·ã³ã°ã§ã¯ãªãçç±ã¯ãValhalla JVMã§ã¯ãã€ã³ã©ã€ã³æ¡å€§ããã³çž®å°å€æãã察å¿ãããã¯ã·ã³ã°ããã³ã¢ã³ãã¯ã·ã³ã°å€æãããã¯ããã«è»œãããã§ãã ãã¯ã·ã³ã°ã®åé¡ã¯ãã¢ãããã¯ïŒèš³æ³šïŒããªããã£ããšããéãããåã®ã¿ã«å®çŸ©ãããŠããããšïŒã§ãããã³ã¹ãããããããšã§ãã ç§ãã¡ã¯ãããã®äž¡æ¹ã®æžå¿µã«å¯ŸåŠããããšããŠããŸãã
ã€ã³ã©ã€ã³ã»ã¯ã©ã¹ã¯ã€ã³ã¿ãã§ãŒã¹ãå®è£
ããããšãã§ããŸããä»»æã®ã¯ã©ã¹ãæ¡åŒµããããšã¯ã§ããŸããããæœè±¡ã¯ã©ã¹ã®éãããã«ããŽãªãæ¡åŒµããããšãã§ããŸããã€ãŸãããã£ãŒã«ããæãããæ¬äœã空ã§ããåŒæ°ãªãã³ã³ã¹ãã©ã¯ã¿ãæã¡ããã以å€ã®ã³ã³ã¹ãã©ã¯ã¿ãæãããã€ã³ã¹ã¿ã³ã¹åæååã¯ãªããåæã¡ãœãããæããããã®ã¹ãŒããŒã¯ã©ã¹ããã¹ãŠåãæ¡ä»¶ãæºãããŠããã¯ã©ã¹ã§ãïŒObject
ãš Number
ã¯ãã®ãããªã¯ã©ã¹ã®äŸã§ãïŒã
äžããããã€ã³ã©ã€ã³ã¯ã©ã¹ã®ãªããžã§ã¯ããžã® åç
§ ã®éåã« null
ãå ããŠèšè¿°ã§ãããšäŸ¿å©ãªããšããããããŸãã
ã€ã³ã©ã€ã³å V
ãäžãããããšããå€ã®éåã次ã®ããã«äžããããåç
§å R
ã欲ãããšæããŸãã
ValSet(R)â=â{null} ⪠{ref v : vâââValSet(V)}
ãã®ãããªå R
ã V
ã® åç
§å°åœ± ãšåŒã³ãŸãïŒåç
§åã¯ãããèªèº«ã®åç
§å°åœ±ã§ãïŒã
åç
§å°åœ±ã¯ãçŸåšã®äžçã§ã¯ã©ãããŒã¯ã©ã¹ãæãã圹å²ãæ
ã£ãŠããŸãããããããã¹ãŠã®ã€ã³ã©ã€ã³ã¯ã©ã¹ã«ææžãã®ã¢ãããã¯ãªã©ãããŒãæããããã¯ãããŸããã
ã€ã³ã©ã€ã³ã¯ã©ã¹ããåç
§å°åœ±ãæ©æ¢°çã«å°åºãããããåç
§ããããã®çµ±äžãããæ¹æ³ãæã¡ããã®ã§ãã
ããããã°ãã€ã³ã©ã€ã³ã¯ã©ã¹ãšãã®åç
§å°åœ±ã察å¿ä»ããã¡ã³ã¿ã«ãã£ã¯ã·ã§ããªãç¶æããå¿
èŠã¯ãããŸããã
ä»»æã®å T
ã«å¯ŸããŠãT.ref
㯠T
ã®åç
§å°åœ±ãè¡šããŸãã
ã€ã³ã©ã€ã³ã»ã¯ã©ã¹ã®å Žåãåç
§å°åœ±ãšå€å°åœ±ã®äž¡æ¹ãèªåçã«äœæããŸãã
ã€ã³ã©ã€ã³ã¯ã©ã¹ V
ã®å ŽåãV.ref
㯠V
ã®åç
§å°åœ±ïŒV
ã®ã€ã³ã¹ã¿ã³ã¹ãžã®åç
§ã®éåã« null
ãå ãããã®ïŒãèšè¿°ããåã§ãããV.val
㯠V
ã®å€å°åœ±ïŒV
ã®ã€ã³ã¹ã¿ã³ã¹ã®éåïŒãåç
§ããŸãã
ãããŠïŒåŸã§è¿°ã¹ããããªç¹å¥ãªç³ãç«ãŠããªãå Žåã¯ïŒ V
㯠V.val
ã®ãšã€ãªã¢ã¹ã§ãã
ïŒãã®åç
§å°åœ±ã¯ãV.val
ã®ã¿ããµãã¿ã€ããšããŠèš±å¯ããã·ãŒã«ãããæœè±¡ã¯ã©ã¹ã§ããïŒ
ã€ãŸããæœè±¡ã¯ã©ã¹ C
ãæ¡åŒµããã€ã³ã©ã€ã³ã¯ã©ã¹ V
ã®å Žåã以äžã®ããã«ãªããŸãã
sealed abstract class V.ref
extends C
permits V.val { }
inline class V.val extends V.ref { }
ãããŠãV
㯠V.val
ã®ãšã€ãªã¢ã¹ã«ãªããŸãã
ïŒãã®çš®ã®ãšã€ãªã¢ã¹ã¯æ°ãããã®ã§ã¯ãããŸãããString
ã¯java.lang.String
ã®ãšã€ãªã¢ã¹ã§ããïŒ
V.val
ããV.ref
ãžã®ã€ã³ã©ã€ã³ã»ã¯ã€ããã³ã°å€æãèªåçã«è¡ãããŸãïŒãããã£ãŠãV
ãã V.ref
ãžã®å€æãè¡ãããŸãïŒã
ããã«ãV.ref
ãã V.val
ãžïŒãããã£ãŠãV.ref
ããV
ãžïŒã®ã€ã³ã©ã€ã³ãããŒã€ã³ã°å€æãå®çŸ©ããŸãã
ãã㯠unref
æŒç®åãé©çšãããã®ã§ãnull
ã«å¯ŸããŠã¯NullPointerException
ãã¹ããŒããŸãã
ãã®äžå¯Ÿã®å€æã«ãã£ãŠãã€ã³ã©ã€ã³ã¯ã©ã¹ã¯ãæŽå²çã«ã©ãããŒåãšããªããã£ããããã§ãã£ãããã«ãåç §å°åœ±ãšåãé¢ä¿ãæã¡ãŸãã ãã¯ã·ã³ã°å€æïŒãªãŒããã¯ã·ã³ã°ãæ¡ä»¶åŒã®åä»ãããªãŒããŒããŒãã®éžæïŒã®èŠ³ç¹ããå®çŸ©ãããŠããæ¢åã®ã«ãŒã«ã¯ãã€ã³ã©ã€ã³ã®æ¡å€§ãšçž®å°ã®å€æãçµã¿èŸŒãããã«ãç°¡åã«æ¡åŒµããããšãã§ããŸãã ãã®çµæãæ¢åã®èšèªã«ãŒã«ãšããããã®å€æã«é¢ãããŠãŒã¶ãŒã®çŽæã¯ãæ°ããäžçã§ãå€æŽãããããšãªãåé²ããããšãã§ããŸã - ããããããã¯ã¹åã®å®è¡æéã³ã¹ãã¯ãããŸããã ãªããªããçŸåšã®ãã¯ã·ã³ã°ã®ããã«ãã€ã³ã©ã€ã³ã®æ¡å€§ã¯å¶ç¶ã®ã¢ã€ãã³ãã£ãã£ãæã€æ°ãããªããžã§ã¯ãã®çæã匷å¶ãããã®ã§ã¯ãªãããã§ãã
åç
§å R
ã¯ãã§ã«ããèªèº«ã®åç
§å°åœ±ã§ããããã®ãã¹ãŠã®èŠä»¶ãæºãããŠããã®ã§ã
åç
§å R
ã«ã€ããŠã¯ã R.ref
ã R
èªèº«ã®ãšã€ãªã¢ã¹ã«ããŸãã
ããã§ããã¹ãŠã®å T
ã T.ref
ãšåŒã°ããåç
§å°åœ±ãæã€ããšãä¿èšŒãããŸããã
ã€ã³ã©ã€ã³ã¯ã©ã¹ V
ã¯ã2ã€ã®åïŒV.ref
ãš V.val
ãããã«åãšã€ãªã¢ã¹ V
ïŒãçæããŸãã
ãããŠåããã2ã€ã®ã¯ã©ã¹ãã©ãŒãçæãããŸãã
ããããåç
§å°åœ±ã¯æœè±¡ã¯ã©ã¹ãªã®ã§ãã©ã®ã€ã³ã¹ã¿ã³ã¹ããããåç
§å°åœ±ã®ã€ã³ã¹ã¿ã³ã¹ã§ããããšãå ±åããããšã¯ãããŸããã
V
ã®å€ãžã®énullåç
§ã¯ãV.val
ã®ã€ã³ã¹ã¿ã³ã¹ã§ããããšãå ±åããŸãã
æŽå²çã«ã¯ãã¯ã©ã¹ãã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããããšã¯ããã€ãã®ããšãæå³ããŠããŸããã
- é©åæ§ã ã¯ã©ã¹ã«ã¯ãã¡ã³ããŒãšããŠãã€ã³ã¿ãŒãã§ãŒã¹ã®ãã¹ãŠã®ã¡ã³ããŒããããŸãã
- æšç§»æ§ã ãã®ã¯ã©ã¹ã®ãµãã¯ã©ã¹ãã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããŸãã
- ãµãã¿ã€ãã³ã°ã ã¯ã©ã¹åã¯ãã€ã³ã¿ãŒãã§ãŒã¹åã®ãµãã¿ã€ãã§ãã
ã€ã³ã©ã€ã³ã¯ã©ã¹ããµããŒãããããã«ããã®æåŸã®ç®æ¡æžãã§ãããµãã¿ã€ãã³ã°ãå°ãã ãæŽç·Žãããå¿ èŠããããŸãã ã€ã³ã©ã€ã³ã»ã¯ã©ã¹ã® åç §å°åœ± ã¯ãã€ã³ã¿ãŒãã§ãŒã¹ã»ã¿ã€ãã®ãµãã¿ã€ãã§ãããšèšããŸãã ïŒã¢ã€ãã³ãã£ãã£ã¯ã©ã¹åã¯ããèªèº«ã®åç §å°åœ±ãªã®ã§ããã®å®£èšã¯ãã¹ãŠã®ã¯ã©ã¹ã«é©çšãããŸããïŒ åæ§ã«ãã€ã³ã©ã€ã³ã¯ã©ã¹ãæœè±¡ã¯ã©ã¹ãæ¡åŒµããŠããå Žåãåç §å°åœ±ã¯æœè±¡ã¯ã©ã¹ã®ãµãã¿ã€ãã§ããããšãæå³ããŸãã
Object
ã«ã¯ããã¹ãŠã®ã¯ã©ã¹ãã€ã³ã©ã€ã³ãããã³ã¢ã€ãã³ãã£ãã£ã®ã«ãŒãåãšããŠã®åœ¹å²ããããããã€ã³ã¿ãŒãã§ãŒã¹ãšå€ãã®ç¹æ§ãå
±æããŠããŸãã
æ¢ã«è¿°ã¹ãããã«ããã¹ãŠã®ã€ã³ã©ã€ã³åãã Object
ãžã®ã€ã³ã©ã€ã³æ¡å€§å€æããããŸãã
ãã ãã Object
ã¯å
·è±¡ã¯ã©ã¹ã§ãããããæ®å¿µãªãããã³ã³ã¹ãã©ã¯ã¿ãŒãä»ã㊠Object
çŽæ¥ã€ã³ã¹ã¿ã³ã¹åããããšã¯å¯èœã§ãã
ã€ã³ã¿ãŒãã§ãŒã¹ã¯ç¶æ¿ãããããã Object
㯠InlineObject
ã IdentityObject
ãå®è£
ã§ããŸããã
ã§ããã new Object()
ã«ããã€ã³ã¹ã¿ã³ã¹åã®çµæã¯ã¢ã€ãã³ãã£ãã£åã®ã€ã³ã¹ã¿ã³ã¹ã§ããå¿
èŠããããŸãïŒä»ã®çç±ã§ Object
ãã€ã³ã¹ã¿ã³ã¹åãããã€ã³ãããªãããïŒã
ãã®çœ ããã¯ãããåºãã«ã¯ãæã®èŸŒãã åããå¿
èŠã§ãã
ãŸã㯠IdentityObject
ãè¿ãéçãã¡ã¯ããªãŒ Object::newIdentity
ãäœæãã
ãããããããŸããŸãªããŒã«ïŒã³ã³ãã€ã©ãŒèŠåãJITã®ããžãã¯ãªã©ïŒã䜿ã£ãŠãæ¢åã®ãœãŒã¹ããã³ãã€ããªãŒã§ã® new Object()
ã®äœ¿çšããã¡ãã«ç§»è¡ããããšããããšããå§ããŸãããã
ãããŠæçµçã«ã¯ãçŽæ¥ã€ã³ã¹ã¿ã³ã¹åããããã® Object
ã³ã³ã¹ãã©ã¯ã¿ãŒãïŒ protected
ã«ããŠããŸãããšã§ïŒãå»æ¢ãããã®ã§ãã
ã€ã³ã©ã€ã³ãªããžã§ã¯ãã® ==
æ¡åŒµã¯å®äºããŠããŸããã
ã€ã³ã©ã€ã³ãªããžã§ã¯ãèªäœã«å¯ŸããŠã¯å®çŸ©ããŸããããåç
§åã§ãå€éåã®äžã«ã€ã³ã©ã€ã³ãªããžã§ã¯ããžã®åç
§ãæã€å¯èœæ§ã®ãããã®ã«ã€ããŠã¯ãŸã å®çŸ©ããŠããŸããã
ããã«ã€ããŠã2ã€ã®ãªããžã§ã¯ãåç
§ãçãããšã¯ãäž¡æ¹ãšãnullã§ããããåãã¢ã€ãã³ãã£ãã£ãªããžã§ã¯ããžã®åç
§ã§ãããããŸã㯠==
ãæç«ãã2ã€ã®ã€ã³ã©ã€ã³ãªããžã§ã¯ããžã®åç
§ã§ããå ŽåãšããŸãã
ããã«ããã ==
㮠代å
¥å¯èœæ§ ã®ã»ãã³ãã£ã¯ã¹ããã¹ãŠã®å€ã«æ¡åŒµãããŸãã
ããªãã¡ã2ã€ã®å€ã¯ã NaN
ãæã€åŸæ¥ã®åäœãé€ããŠãã©ã®ãããªæ¹æ³ã§ãåºå¥ã§ããªãå Žåã«ã®ã¿ ==
ã§ãã
ããã«ããã ==
ã«ã€ããŠã次ã®æçšãªäžå€åŒïŒ NaN
ã®åŸæ¥ã®åäœãé€ããã¹ãŠã§æãç«ã€ïŒãåŸãããŸãã
==
ã¯åå°çãããªãã¡ãã¹ãŠã®v
ã«å¯ŸããŠv == v
ã§ãã- 2ã€ã®ã€ã³ã©ã€ã³å€ãåç
§ã«æ¡å€§ããããšããå
ã®å€ã
==
ã ã£ãå Žåã«ã®ã¿ãçµæã==
ãšãªããŸãã - 2ã€ã®åç
§ãã€ã³ã©ã€ã³ãªããžã§ã¯ãã«çž®å°ããããšããå
ã®åç
§ã
==
ã ã£ãå Žåã«ã®ã¿ãçµæã==
ãšãªããŸãã
Object::equals
ã®åºæ¬å®è£
ã¯ã ==
ã«å§ä»»ããŸãã
Object::equals
ãæ瀺çã«ãªãŒããŒã©ã€ãããªãã€ã³ã©ã€ã³ã¯ã©ã¹ã§ã¯ããããããã©ã«ãã§ãã
ïŒåæ§ã«ã Object::hashCode
ã®åºæ¬å®è£
㯠System::identityHashCode
ã«å§ä»»ããŸãããããããã©ã«ãã§ããïŒ
åç §å°åœ±ã®å®çŸ©ã¯æå³ããããåç §åãšã®é¢ä¿ã«ã€ããŠã®æ¢åã®çŽèŠ³ãšäžèŽããŠããŸããããããã®åãéåžžã«éèŠã§ãã çç± ããŸã ååã«åæ©ä»ããŠããŸããã
ã€ã³ã©ã€ã³åã䜿çšã§ããªãå Žåã¯æ¬¡ã®ããã«ããã€ããããŸãã
- ç¡å¹å€ã Nullã¯ã€ã³ã©ã€ã³åã®å€ã§ã¯ãªãããã¹ãŠã®åç §åã®å€ã§ããããVåã®nullå€ãèš±å¯ããå€ããšããæŠå¿µãè¡šçŸãããå ŽåããããŸãã
- éå¹³åŠåã ã€ã³ã©ã€ã³å€ã¯ãªããžã§ã¯ããšé åã«èŠåæ£ãããã©ããåãããŸãã éåžžãããã¯ç§ãã¡ãæããã®ã§ãã ãã ããå Žåã«ãã£ãŠã¯ãã¡ã¢ãªãŒäœ¿çšçããã现ããå¶åŸ¡ããå¿ èŠãããå ŽåããããŸããããšãã°ããå¹ ã®åºããã€ã³ã©ã€ã³ã¯ã©ã¹ïŒå€ãã®ãã£ãŒã«ããæã€ã¯ã©ã¹ïŒãããããããã®çãªé åãå¿ èŠãªå Žåãªã©ã§ã - å¹³åŠåãããå€ã®é åããããåç §ã®é åã®æ¹ãã¡ã¢ãªãŒãå¹ççã«äœ¿ããå ŽåããããŸãã
- ååž°è¡šçŸã ã€ã³ã©ã€ã³ã¯ã©ã¹ã¯ãè¡šçŸã«ã€ããŠèªåèªèº«ã«ååž°çã«äŸåããããšã¯ã§ããŸããã éåžžãããã¯é倧ãªå¶éã§ã¯ãããŸããããåç
§åã§ãããã·ãã¥ã¬ãŒããããå ŽåããããŸãïŒããšãã°ãã次ã®ããã£ãŒã«ããæã€
Node
ã¯ã©ã¹ïŒã - åæ¶å»ã«ãããžã§ããªã¯ã¹ã æ¢åã®åæ¶å»ãžã§ããªã¯ã¹ã¯ãåãã©ã¡ãŒã¿ãŒãåç §åã§ããããšãåæãšããŠããŸã - ã¢ã€ãã³ãã£ãã£äŸåã®æäœããnullå€ãªã©ãèš±å¯ãããŸããç¹æ®åããããžã§ããªã¯ã¹ã䜿ããããã«ãªã£ãŠãã€ã³ã©ã€ã³åãšåæ¶å»ãžã§ããªã¯ã¹ã®çžäºéçšãã§ããããã«ãªããŸã§ãåãã©ã¡ãŒã¿ãŒã«ã¯åç §åã䜿çšãããã®ã§ãã
- 劥åœãªãŒãããªãå Žåã ã€ã³ã©ã€ã³åã®ããã©ã«ãå€ã¯ããã¹ãŠã®ãã£ãŒã«ããããã©ã«ãå€ããšãå€ã§ãã äžéšã®åã§ã¯ããã®å€ã¯åŠ¥åœã§ãïŒ
Point
ã®ããã©ã«ãå€ãšããŠ(0, 0)
ã¯åŠ¥åœã§ãïŒããå Žåã«ãã£ãŠã¯ïŒRational
ãªã©ïŒããã®å€ã¯ç¡æå³ãããŸãã¯å±éºã§ãããããŸãã ãããã£ãå Žåã¯ãåæåãããŠããªãå€ãè¡šãããã«null
ã䜿çšã§ããããã«ãåç §åã䜿çšãããããšããããŸãã
ããããã¹ãŠã®ç¶æ³ã§ãã€ã³ã©ã€ã³åã®ä»£ããã«åç
§åã䜿çšã§ããŸãã
ãã ãã Object
ãªã©ã®åºãåç
§åã䜿çšãããšãå€ãã®æ倱ãçºçããŸã - åå®å
šæ§ã倱ãããã¯ã©ã€ã¢ã³ãã¯ã€ã³ã©ã€ã³ã®äžçã«æ»ãããã«ã³ãŒãã«æªãã§ãã¯ã®ãã£ã¹ããæ¿å
¥ããå¿
èŠããããŸãã
ã€ã³ã©ã€ã³åã«åç
§å°åœ±ã䜿çšããã°ãã€ã³ã©ã€ã³ã®æ¡å€§ãšçž®å°ã®å€æã«ãã£ãŠãå€éåãç¹å®ã®ã€ã³ã©ã€ã³ã¯ã©ã¹ã®å€éåãšå¯æ¥ã«çµã³ä»ããããåç
§åããããæ瀺çãªå€æã䜿çšããã«ãã®ã€ã³ã©ã€ã³ã¯ã©ã¹ã«èªç±ã«å€æã§ããŸã â ããã«ãããç§ãã¡ãæãåã®å®å
šæ§ãšå©äŸ¿æ§ãæãããŸãã
äŸãšããŠãç¹æ®ãªã€ã³ã¹ã¿ã³ã¹åããµããŒãããããã« Map
ã€ã³ã¿ãŒãã§ãŒã¹ã移è¡ããåé¡ãèããŠãã ããã
Map::get
ã¡ãœããã¯ãèŠæ±ãããããŒããããã«ååšããªãå Žå㯠null
ãè¿ããŸããã Map
ã® V
ãã©ã¡ãŒã¿ãŒãã€ã³ã©ã€ã³åã®å Žåã null
ã¯å€éåã®ã¡ã³ããŒã§ã¯ãããŸããã
get()
ã¡ãœããã以äžã®ããã«å®£èšããã°ããããææã§ããŸãã
public V.ref get(K key);
ããã¯ã Map::get
ã®æ»ãå€ã®åã V
ãžã®åç
§ãããŸã㯠null
åç
§ã®ã©ã¡ããã«ãªããšããæŠå¿µãæããŠããŸãã
ãããŸã§ã«èª¬æããææ³ã¯æ°ããã³ãŒãã«ã¯ååã§ãããæºåããŠãããã移è¡ã·ããªãªãããã€ããããŸãã
å€ããŒã¹ã®ã¯ã©ã¹ããã§ã«ããã€ãååšããŠããŠããããã¯ã€ã³ã©ã€ã³ã¯ã©ã¹ãžã®ã¹ã ãŒãºãªç§»è¡ãå¯èœã«ããããã«èšèšãããäžé£ã®å¶éãæºãããŠããŸãã
ãã®ãããªäŸã®1ã€ã« java.util.Optional
ããããŸããããã¯ãJava 8ã«ã€ã³ã©ã€ã³ã¯ã©ã¹ããã£ããšãããªãã€ã³ã©ã€ã³ã¯ã©ã¹ãšããŠå®£èšã§ããã¯ãã§ãã
Optional
ãã€ã³ã©ã€ã³ã¯ã©ã¹ã«ç§»è¡ããŠãã€ã³ã©ã€ã³ã¯ã©ã¹ã®å®è¡æã®å©ç¹ã掻çšããããšæããŸãã
ïŒ java.util.time
ããã±ãŒãžã®ã¯ã©ã¹ãåæ§ã®ç¶æ³ã«ãããŸããïŒ
æ¢åã®ã¯ã©ã€ã¢ã³ãã«ã¯ãå€æ°ã®åãã¡ãœããã®ãã©ã¡ãŒã¿ãŒãŸãã¯æ»ãå€ã®åãåãã©ã¡ãŒã¿ãŒãªã©ã§ã Optional
åãå€æ°äœ¿çšãããŠããŸãã
ãããã®ã¯ã©ã€ã¢ã³ãã¯ãã¹ãŠã Optional
ãåç
§åã§ãããšæ³å®ããŠãããåç
§åã¯nullå¯èœã§ãã
ãããã£ãŠã Optional
ãçŽæ¥ã€ã³ã©ã€ã³åã«ç§»è¡ããããšã¯ã§ããŸããã
次åçã¯ã Optional
ãäœããã®ã€ã³ã©ã€ã³ã»ã¯ã©ã¹ã®åç
§å°åœ±ãšããŠå®çŸ©ããããšã§ãã
ããã¯ãOptional
ãæœè±¡ã¯ã©ã¹ã«ç§»è¡ãããã äžã€ã®ã€ã³ã©ã€ã³ã¯ã©ã¹ïŒå€å°åœ± Optional.val
ïŒã ãèš±å¯ããããã«ã·ãŒã«ãããããã«æé
ããããšãæå³ããŸãã
ãã®ç§»è¡åŸã Optional
ã® ã€ã³ã¹ã¿ã³ã¹ ã¯ã¢ã€ãã³ãã£ãã£ã¯ã©ã¹ã§ã¯ãªãã€ã³ã©ã€ã³ã¯ã©ã¹ã«ãªããŸãããæ¢åã®ã³ãŒãã¯åŒãç¶ããåç
§ãä»ã㊠Optional
å€ãæ ŒçŽãããæž¡ãããããŸãã
ããããçŽæ¥è¡šçŸããããšãå®éã«éããçãã®ã¯ãããããããŒãã«åºäŒãå Žæãã€ãŸããã£ãŒã«ããšé
åèŠçŽ ã§ãã
ãããŠããã§ã¯ã Optional
ã®ãããç¹å®ã®çšéã Optional.val
ã«èªç±ã«ãã€æ®µéçã«ç§»è¡ã§ããŸãã
ã€ã³ã©ã€ã³ã®æ¡å€§ãšçž®å°ã®å€æã«ãã£ãŠããã£ãŒã«ããŸãã¯é
åã Optional
ãã Optional.val
ã«å€æŽããã®ã¯ããœãŒã¹äºæã®å€æŽã«ãªããŸãã
æ¢åã®APIã¯ãåç
§å°åœ±ã§ãã Optional
ãåŒãç¶ã䜿çšããå¯èœæ§ãé«ãã§ãããã
ãã®ããªãã¯ãéæããããã«ãOptional
ã®ã€ã³ã©ã€ã³ã»ã¯ã©ã¹ã宣èšããŠåç
§å°åœ± Optional.ref
ãšå€å°åœ± Optional.val
ãçæãããã®ã§ããããšã€ãªã¢ã¹ Optional
ãéã«ããŠå€å°åœ±ã§ã¯ãªãåç
§å°åœ±ãåç
§ããããã«ãããã®ã§ãã
ããã¯ã宣èšãä¿®æ£ã㊠ref-default
ã€ã³ã©ã€ã³ã»ã¯ã©ã¹ ã§ããããšã瀺ãããšã§å®çŸã§ããŸãã
ref-default inline class Optional<T> {
// current implementation of Optional
}
ref-default
修食åãæã€å¯äžã®å¹æã¯ãè£
食ãããŠããªãååãæã瀺ãã®ã¯ã2ã€ã®å°åœ±ã®ãã¡ã©ã¡ããã決å®ããããšã§ãã
ãã®ãããªç§»è¡ããçããå¯èœæ§ã®ããéäºæã¢ãŒãã1ã€ãããŸã - ã¯ã©ã€ã¢ã³ãã getClass()
ã®çµæãš Optioinal.class
ãæ¯èŒããå Žåã§ãã
移è¡åã¯ã Optional
ã€ã³ã¹ã¿ã³ã¹ã¯ Optional.class
ã¯ã©ã¹ãæã£ãŠããŸãã
Optional
ãæœè±¡ã¯ã©ã¹ã«ç§»è¡ããããšã Optional
ã€ã³ã¹ã¿ã³ã¹ã¯ èªåèªèº«ãå€å°åœ± Optional.val
ã®ã€ã³ã¹ã¿ã³ã¹ã§ãããšå ±åããã§ãããã
M.class
ã®äœ¿çšãåãå·»ããã®éäºææ§ã¯ãããã§æŠèª¬ãã移è¡ã¢ãããŒãã®äž»èŠãªäºææ§ã³ã¹ãã§ããããã¯ãgetClass()
ã®çµæãšã€ã³ã¿ãŒãã§ãŒã¹ãæœè±¡ã¯ã©ã¹ã®ã¯ã©ã¹ãªãã©ã«ãšã==
ã§æ¯èŒãããšãã«ã³ã³ãã€ã«èŠåãçºè¡ããããšã§å€å°ç·©åã§ããŸããå®è¡æã«å€±æããããšãããã£ãŠããããã§ãã
ã€ã³ã©ã€ã³åã«ããªããã£ãã®æœè±¡åãšãã圹å²ãå²ãåœãŠãŸããããå®éã«ããªããã£ããã€ã³ã©ã€ã³åã«å å«ã§ããããã«ããããã«ãããã«äœæ¥ãå¿ èŠã§ãã
ã©ãããŒåã§ãã Integer
ãšãã®ä»²éãã¡ããOptional
ã®ç§»è¡ãšåãææ³ãçšããŠãã·ãŒã«ãããæœè±¡ã¯ã©ã¹ã«ç§»è¡ããããšããå§ããŸãã
ãããã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãããªããã£ãã®åç
§å°åœ±ã«ãªããŸãã
ãããè¡ãã«ã¯ããŸããããªããã£ãã©ãããŒã®ã¢ã€ãã³ãã£ãã£ãžã®äŸåæ§ããŠãŒã¶ãŒãã解æŸããªããã°ãªããŸããã
ãããè¡ãã«ã¯ããããªãã¯ãªã³ã³ã¹ãã©ã¯ã¿ãéæšå¥šã«ããŠïŒå®éã«ã¯åé€ããã®ã§ã¯ãªããã©ã€ããŒãã«ãªããŸãïŒã移è¡æéäžã¯Integer
ã®ã€ã³ã¹ã¿ã³ã¹ããæ°žä¹
ã«ããã¯ããããç¶æ
ã«ããŸãïŒããã§ã®ã¢ãããŒãã«ã€ããŠã¯ JEP 169 ãåç
§ããŠãã ããïŒã
ãã®åãã¯ãããªããã£ãã©ãããŒã®ã¢ã€ãã³ãã£ãã£ã«äŸåããã³ãŒããå£ããªã¹ã¯ããããŸããä»£å ¥å¯èœæ§ãæã£ã
==
ã®å®çŸ©ãèããã°ã==
ã«ããæ¯èŒã¯ã»ãŒåé¡ã«ãªããŸããããã©ãããŒãããã¯ããã³ãŒãã¯å®è¡æã«å€±æããã§ãããã
ãã®åŸãããªããã£ãåãã€ã³ã©ã€ã³ã¯ã©ã¹ãšããŠæ瀺çã«å®£èšã§ããŸãã
inline class int { /* implementation */ }
èªå·±åç
§ã«ã€ããŠã¯æããã«å€å°ã®èª¿æŽãè¡ãå¿
èŠããããŸãããã¬ã¬ã·ãŒã©ãããŒã®ååãããªããã£ãã«åãããããã«ãããã«ããã€ãã®ä¿®æ£ãå ããŸããããä»ãã int
ã«ã¹ãŒããŒã€ã³ã¿ãŒãã§ãŒã¹ãšã€ã³ã¹ã¿ã³ã¹ã¡ãœãããè¿œå ããã®ãèªç±ã§ãããéåžžã¯ã¯ã©ã¹ã®ããã«æ±ãããšãã§ããŸãã
åç
§å°åœ± int.ref
㯠Integer
ã®ãšã€ãªã¢ã¹ã«ãªã£ãŠããŠã Integer.val
㯠int
ã®ãšã€ãªã¢ã¹ã«ãªã£ãŠããŸãã
2ã€ã®åã®é¢ä¿ã¯ã移è¡ãããå€ããŒã¹ã®ã¯ã©ã¹ã®å Žåãšåãã§ãã
ããªããã£ããçã®ã€ã³ã©ã€ã³åã§ããå Žåã§ããé
åã®éã«ã¯åŒãç¶ã以äžã®ãµãã¿ã€ãã³ã°é¢ä¿ããããŸãã
int[] <: Integer[] <: Object[]
次ã«ãint
ãš Integer
ã®éã§å®çŸ©ããã2çµã®å€æã調æŽããªããã°ãªããŸããã
æ¢åã®ãã¯ã·ã³ã°å€æãšãæ°ããªã€ã³ã©ã€ã³çž®å°ã»æ¡å€§å€æã§ãã
ãããã䟿å©ãªããšã«ãã©ãããŒã¯ã©ã¹ã®å¶çºçãªã¢ã€ãã³ãã£ãã£ïŒéæšå¥šã§ãïŒãé€ãããããã¯åãã»ãã³ãã£ã¯ã¹ãæã€ããã«å®çŸ©ããŠããŸãã
ãã¯ã·ã³ã°ã¯ãã©ã³ã¿ã€ã ãèŠåæ£ããæé©åã«ãã£ãŠé€å»ããããšãããåçŽã«ãªããŸããããã®äžæ¹ã§ãå€æãããªãŒããŒããŒãéžæããæšè«ã«ãŸã€ãããã¹ãŠã®æ¢åã«ãŒã«ã¯ç¶æãããŸãã
åæ§ã«ããªãŒããŒããŒãéžæã§ã®ãã¯ã·ã³ã°ã®åœ¹å²ãäžè¬åããŠãã€ã³ã©ã€ã³ã®æ¡å€§ãšçž®å°ã代ããã«äœ¿çšã§ããããããã®ç§»è¡ã§ã¯ãªãŒããŒããŒãéžæã®æ±ºå®æ¹æ³ã¯å€æŽãããŸããã
ãžã§ããªã¯ã¹ã¯çŸåšãåäžã®åç
§ã«åæ¶å»ãããŸãã
ãããã¯ãžã§ããªã¯ã¹ããã®è¡šçŸãç¹æ®åã§ããããã«ããŠã ArrayList<Point>
ã®ãããªãžã§ããªãã¯åã Point[]
ãããããå¹³åŠåãšå¯åºŠã®å©ç¹ãåŸãããšãã§ããããã«ããããšæã£ãŠããŸãã
ããã«ã¯è¿œå ã®æéããããã移è¡äºææ§ã®åé¡ãããã«çºçããŸãã
ArrayList
ãç¹æ®åå¯èœãªåã«ç§»è¡ããŠããæ¢åã®ã¯ã©ã¹ãã¡ã€ã«ã¯ åæ¶å»ã«ãã ArrayList
ãžã®åç
§ãå€ãæ®ããããŸãŸã§ãããããããããã¯åŒãç¶ãåäœããå¿
èŠããããŸãã
å°æ¥ã®æ©èœãšããŠãç¹æ®åããããžã§ããªã¯ã¹ã®äœå°ãæ®ãããšããŠããŸãã
çŸåšã®åæ¶å»ããããžã§ããªã¯ã¹ã¯ãåç
§åã§ã®ã¿æ©èœãç¶ããå¯èœæ§ããããŸãã
List<int>
ã Optional<Point>
ãªã©ã®ç¹æ®åãããåã«ã€ããŠã¯ãå°æ¥çã«èªç¶ãªè¡šèšæ³ãäºçŽããããšèããŠããŸãã
ãããè¡ãã«ã¯ãåæ¶å»ããããžã§ããªã¯ã¹ã§ã¯ãåç
§åã®ã¿ãååŒæ°ãšããŠæå¹ã§ããããšãèŠæ±ããŸãã
ä»æ¥ã人ã
㯠List<Integer>
ãšæžããŠããŸãã
ãã㯠List<int.ref>
ããã³ List<Point.ref>
ãšäžè¬åãããŸãã
ç§ãã¡ãåã£ãã¢ãããŒãã¯ãããªããã£ããšåç §ã«ãããæ¢åã®åææ§é ãç¶æããäžæ¹ã§ãããèŠåçã§ããã©ãŒãã³ã¹ã®é«ããã®ã«ããããšã§ãã ãã¯ã·ã³ã°ã¯ãã£ãšã³ã¹ããäœããªã£ãŠåœ±ã®äžã«é ãããããã€ã³ã©ã€ã³ãã¯ãããªããã£ããã®æ°ããèšèã§ãããããªããã£ãã®éåã¯æ¡åŒµå¯èœã§ãã ç§ãã¡ã¯ãéããã¯ã·ã³ã°ã䌎ãåç §ãšããªããã£ããããã軜ããã¯ã·ã³ã°ã䌎ãåç §ãšã€ã³ã©ã€ã³ãã«ç§»è¡ããŸãããã2ã€ã®äžçã¯ã»ãŒååã®ãŸãŸã§ãã
çŸåšã®äžç | Valhalla |
---|---|
åç §ãšããªããã£ã | åç §ãšã€ã³ã©ã€ã³ïŒããªããã£ãã¯ã€ã³ã©ã€ã³ïŒ |
ããªããã£ãã«ã¯ããã¯ã¹ããããŸã | ã€ã³ã©ã€ã³ã«ã¯åç §å°åœ±ããããŸã |
ããã¯ã¹ã«ã¯ã¢ã€ãã³ãã£ãã£ãããã getClass() ã§è¡šç€ºãããŸã | åç §å°åœ±ã¯å®è¡æã«è¡šç€ºãããŸãã |
ãã¯ã·ã³ã°ãšã¢ã³ãã¯ã·ã³ã°ã®å€æ | ã€ã³ã©ã€ã³ã®çž®å°æ¡å€§å€æããã ãã«ãŒã«ã¯åã |
ããªããã£ãã¯çµã¿èŸŒã¿ã§ãéæ³ | ããªããã£ãã¯ã»ãšãã©åãªãã€ã³ã©ã€ã³ã¯ã©ã¹ã§ãè¿œå ã®VMãµããŒããåããŠããŸã |
ããªããã£ãã«ã¯ã¡ãœãããã¹ãŒããŒã¿ã€ãããããŸãã | ããªããã£ãã¯ã€ã³ã©ã€ã³ã¯ã©ã¹ã§ãããã€ã³ã©ã€ã³ã¯ã©ã¹ã«ã¯ã¡ãœãããšã¹ãŒããŒã¿ã€ãããããŸã |
ããªããã£ãé åã¯åçžã§ã | ã€ã³ã©ã€ã³é åã¯å€çžã§ã |
defaultvalue
andwithfield
implementation in openj9