クラスObject
Objectクラスã¯ã€ã‚¯ãƒ©ã‚¹éšŽå±¤ã®ãƒ«ãƒ¼ãƒˆã§ã™ã€‚ ã™ã¹ã¦ã®ã‚¯ãƒ©ã‚¹ã¯ã€ã‚¹ãƒ¼ãƒ‘ー・クラスã¨ã—ã¦Objectã‚’æŒã¡ã¾ã™ã€‚ é…列をå«ã‚€ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトã¯ã€ã“ã®ã‚¯ãƒ©ã‚¹ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’実装ã—ã¾ã™ã€‚ - å°Žå…¥ã•れãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³:
- 1.0
- é–¢é€£é …ç›®:
-
コンストラクタã®ã‚µãƒžãƒªãƒ¼
コンストラクタ -
メソッドã®ã‚µãƒžãƒªãƒ¼
修飾åã¨åž‹ãƒ¡ã‚½ãƒƒãƒ‰èª¬æ˜Žprotected Objectclone()ã“ã®ã‚ªãƒ–ジェクトã®ã‚³ãƒ”ーを作æˆã—ã¦ã€è¿”ã—ã¾ã™ã€‚booleanã“ã®ã‚ªãƒ–ジェクトã¨ä»–ã®ã‚ªãƒ–ジェクトãŒç‰ã—ã„ã‹ã©ã†ã‹ã‚’示ã—ã¾ã™ã€‚protected voidfinalize()削除予定ã®ãŸã‚éžæŽ¨å¥¨: ã“ã®APIè¦ç´ ã¯ã€å°†æ¥ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§å‰Šé™¤ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚最終決定ã¯éžæŽ¨å¥¨ã§ã‚りã€å°†æ¥ã®ãƒªãƒªãƒ¼ã‚¹ã§å‰Šé™¤ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚final Class<?> getClass()ã“ã®Objectã®å®Ÿè¡Œæ™‚クラスを返ã—ã¾ã™ã€‚inthashCode()ã“ã®ã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹ãƒãƒƒã‚·ãƒ¥ãƒ»ã‚³ãƒ¼ãƒ‰å€¤ã‚’è¿”ã—ã¾ã™ã€‚final voidnotify()ã“ã®ã‚ªãƒ–ジェクトã®ãƒ¢ãƒ‹ã‚¿ãƒ¼ã§å¾…機ä¸ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’1ã¤å†é–‹ã—ã¾ã™ã€‚final voidã“ã®ã‚ªãƒ–ジェクトã®ãƒ¢ãƒ‹ã‚¿ãƒ¼ã§å¾…機ä¸ã®ã™ã¹ã¦ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’å†é–‹ã—ã¾ã™ã€‚toString()ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ–‡å—列表ç¾ã‚’è¿”ã—ã¾ã™ã€‚final voidwait()ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒç›®è¦šã‚ã‚‹ã¾ã§å¾…機ã—ã¾ã™ã€‚通常ã€notifiedã¾ãŸã¯interruptedã§ã™ã€‚final voidwait(long timeoutMillis) ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã¯ã€é€šå¸¸ã€notifiedã¾ãŸã¯interruptedã§ã‚ã‚‹ã‹ã€ä¸€å®šã®ãƒªã‚¢ãƒ«ã‚¿ã‚¤ãƒ ãŒçµŒéŽã™ã‚‹ã¾ã§ã€ç›®è¦šã‚ã‚‹ã¾ã§å¾…機ã—ã¾ã™ã€‚final voidwait(long timeoutMillis, int nanos) ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã¯ã€é€šå¸¸ã€notifiedã¾ãŸã¯interruptedã§ã‚ã‚‹ã‹ã€ä¸€å®šã®ãƒªã‚¢ãƒ«ã‚¿ã‚¤ãƒ ãŒçµŒéŽã™ã‚‹ã¾ã§ã€ç›®è¦šã‚ã‚‹ã¾ã§å¾…機ã—ã¾ã™ã€‚
-
コンストラクタã®è©³ç´°
-
Object
public Object()æ–°ã—ã„オブジェクトを構築ã—ã¾ã™ã€‚
-
-
メソッドã®è©³ç´°
-
getClass
public final Class<?> getClass()ã“ã®Objectã®å®Ÿè¡Œæ™‚クラスを返ã—ã¾ã™ã€‚ è¿”ã•れるClassオブジェクトã¯ã€è¡¨ã•れãŸã‚¯ãƒ©ã‚¹ã®static synchronizedメソッドã«ã‚ˆã£ã¦ãƒãƒƒã‚¯ã•れるオブジェクトã§ã™ã€‚実際ã®çµæžœåž‹ã¯
Class<? extends |X|>ã§ã™ã€‚ã“ã“ã§ã€|X|ã¯getClassãŒå‘¼ã³å‡ºã•れるå¼ã®staticåž‹ã®æ¶ˆåŽ»ã§ã™ã€‚ ãŸã¨ãˆã°ã€ã“ã®ã‚³ãƒ¼ãƒ‰ã®æŠœç²‹ã§ã¯ã‚ャストã¯å¿…è¦ã‚りã¾ã›ã‚“。Number n = 0;
Class<? extends Number> c = n.getClass();- 戻り値:
- ã“ã®ã‚ªãƒ–ジェクトã®å®Ÿè¡Œæ™‚クラスを表ã™
Classオブジェクト。 - Java言語仕様をå‚ç…§ã—ã¦ãã ã•ã„:
-
15.8.2 クラス・リテラル
-
hashCode
public int hashCode()ã“ã®ã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹ãƒãƒƒã‚·ãƒ¥ãƒ»ã‚³ãƒ¼ãƒ‰å€¤ã‚’è¿”ã—ã¾ã™ã€‚ ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€HashMapã«ã‚ˆã£ã¦æä¾›ã•れるãƒãƒƒã‚·ãƒ¥è¡¨ãªã©ã®ã€ãƒãƒƒã‚·ãƒ¥è¡¨ã®åˆ©ç‚¹ã®ãŸã‚ã«ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã™ã€‚hashCodeã®ä¸€èˆ¬çš„ãªè¦å‰‡ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™ã€‚- Javaアプリケーションã®å®Ÿè¡Œä¸ã«åŒã˜ã‚ªãƒ–ジェクトã«å¯¾ã—ã¦è¤‡æ•°å›žå‘¼ã³å‡ºã•れãŸå ´åˆã¯å¸¸ã«ã€ã“ã®ã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹
equalsã®æ¯”較ã§ä½¿ç”¨ã•ã‚Œã‚‹æƒ…å ±ãŒå¤‰æ›´ã•れã¦ã„ãªã‘れã°ã€hashCodeメソッドã¯å¸¸ã«åŒã˜æ•´æ•°ã‚’è¿”ã™å¿…è¦ãŒã‚りã¾ã™ã€‚ ãŸã ã—ã€ã“ã®æ•´æ•°ã¯åŒã˜ã‚¢ãƒ—リケーションã®å®Ÿè¡Œã”ã¨ã«åŒã˜ã§ã‚ã‚‹å¿…è¦ã¯ã‚りã¾ã›ã‚“。 - 2ã¤ã®ã‚ªãƒ–ジェクトãŒ
equalsメソッドã«å¾“ã£ã¦ç‰ã—ã„å ´åˆã€2ã¤ã®ã‚ªãƒ–ジェクトã®ãれãžã‚Œã§hashCodeメソッドを呼ã³å‡ºã™ã¨ã€åŒã˜æ•´æ•°çµæžœãŒç”Ÿæˆã•れる必è¦ãŒã‚りã¾ã™ã€‚ - 2ã¤ã®ã‚ªãƒ–ジェクトãŒ
equalsメソッドã«å¾“ã£ã¦ç‰ã—ããªã„å ´åˆã€2ã¤ã®ã‚ªãƒ–ジェクトã®ãれãžã‚Œã§hashCodeメソッドを呼ã³å‡ºã™ã¨ã€å€‹åˆ¥ã®æ•´æ•°çµæžœãŒç”Ÿæˆã•れる必è¦ã¯ã‚りã¾ã›ã‚“。 ãŸã ã—ã€ãƒ—ãƒã‚°ãƒ©ãƒžã¯ã€ç‰ã—ããªã„オブジェクトã«å¯¾ã—ã¦ç•°ãªã‚‹æ•´æ•°ã®çµæžœã‚’生æˆã™ã‚‹ã¨ã€ãƒãƒƒã‚·ãƒ¥è¡¨ã®ãƒ‘フォーマンスãŒå‘上ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ã“ã¨ã«æ³¨æ„ã™ã‚‹ã‚ˆã†ã«ã—ã¦ãã ã•ã„。
- APIã®ãƒŽãƒ¼ãƒˆ:
Objectsã®hashãŠã‚ˆã³hashCodeメソッドを使用ã™ã‚‹ã¨ã€å˜ç´”ãªãƒãƒƒã‚·ãƒ¥ãƒ»ã‚³ãƒ¼ãƒ‰ã‚’構築ã§ãã¾ã™ã€‚- 実装è¦ä»¶:
- 厳密ã«å®Ÿç”¨çš„ãªæ–¹æ³•ã¨ã—ã¦ã€ã‚¯ãƒ©ã‚¹
Objectã«ã‚ˆã£ã¦å®šç¾©ã•れãŸhashCodeメソッドã¯ã€å€‹åˆ¥ã®ã‚ªãƒ–ジェクトã«å¯¾ã—ã¦å€‹åˆ¥ã®æ•´æ•°ã‚’è¿”ã—ã¾ã™ã€‚ - 戻り値:
- ã“ã®ã‚ªãƒ–ジェクトã®ãƒãƒƒã‚·ãƒ¥ãƒ»ã‚³ãƒ¼ãƒ‰å€¤
- é–¢é€£é …ç›®:
- Javaアプリケーションã®å®Ÿè¡Œä¸ã«åŒã˜ã‚ªãƒ–ジェクトã«å¯¾ã—ã¦è¤‡æ•°å›žå‘¼ã³å‡ºã•れãŸå ´åˆã¯å¸¸ã«ã€ã“ã®ã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹
-
equals
public boolean equals(Object obj) ã“ã®ã‚ªãƒ–ジェクトã¨ä»–ã®ã‚ªãƒ–ジェクトãŒç‰ã—ã„ã‹ã©ã†ã‹ã‚’示ã—ã¾ã™ã€‚equalsメソッドã¯ã€NULL以外ã®ã‚ªãƒ–ジェクトå‚ç…§ã«å¯¾ã—ã¦ã€ŒåŒå€¤é–¢ä¿‚ã€ã‚’実装ã—ã¾ã™:- å射性(reflexive): null以外ã®å‚照値
xã«ã¤ã„ã¦ã€x.equals(x)ã¯trueã‚’è¿”ã—ã¾ã™ã€‚ - 対称性(symmetric): null以外ã®å‚照値
xãŠã‚ˆã³yã«ã¤ã„ã¦ã€y.equals(x)ãŒtrueã‚’è¿”ã™å ´åˆã«é™ã‚Šã€x.equals(y)ã¯trueã‚’è¿”ã—ã¾ã™ã€‚ - 推移性(transitive): null以外ã®å‚照値
xã€yã€ãŠã‚ˆã³zã«ã¤ã„ã¦ã€x.equals(y)ãŒtrueã‚’è¿”ã—ã€y.equals(z)ãŒtrueã‚’è¿”ã™å ´åˆã€x.equals(z)ã¯trueã‚’è¿”ã—ã¾ã™ã€‚ - 一貫性(consistent): null以外ã®å‚照値
xãŠã‚ˆã³yã«ã¤ã„ã¦ã€x.equals(y)ã®è¤‡æ•°ã®å‘¼å‡ºã—ã¯ã€ã“ã®ã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹equalsã«ã‚ˆã‚‹æ¯”較ã§ä½¿ã‚ã‚ŒãŸæƒ…å ±ãŒå¤‰æ›´ã•れã¦ã„ãªã‘れã°ã€ä¸€è²«ã—ã¦trueã‚’è¿”ã™ã‹ã€ä¸€è²«ã—ã¦falseã‚’è¿”ã—ã¾ã™ã€‚ - null以外ã®å‚照値
xã«ã¤ã„ã¦ã€x.equals(null)ã¯falseã‚’è¿”ã—ã¾ã™ã€‚
ç‰ä¾¡é–¢ä¿‚ã¯ã€æ“作対象ã®è¦ç´ を「åŒç‰ã‚¯ãƒ©ã‚¹ã€ã«ãƒ‘ーティション化ã—ã€ç‰ä¾¡ã‚¯ãƒ©ã‚¹ã®ã™ã¹ã¦ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯äº’ã„ã«ç‰ã—ããªã‚Šã¾ã™ã€‚ ç‰ä¾¡ã‚¯ãƒ©ã‚¹ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€å°‘ãªãã¨ã‚‚ãªã‚“らã‹ã®ç›®çš„ã§äº’ã„ã«ç½®æ›å¯èƒ½ã§ã™ã€‚
- APIã®ãƒŽãƒ¼ãƒˆ:
- 通常ã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ãŒã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã•れるãŸã³ã«
hashCodeメソッドをオーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã—ã€hashCodeメソッドã®ä¸€èˆ¬å¥‘ç´„ã‚’ç¶æŒã™ã‚‹ã«ã¯ã€åŒç‰ã®ã‚ªãƒ–ジェクトãŒåŒç‰ã®ãƒãƒƒã‚·ãƒ¥ãƒ»ã‚³ãƒ¼ãƒ‰ã‚’æŒã¤å¿…è¦ãŒã‚ã‚‹ã“ã¨ã‚’示ã—ã¾ã™ã€‚2ã¤ã®å¼•æ•°ã®
Objects.equalsメソッドã¯ã€NULLã®å¯èƒ½æ€§ãŒã‚ã‚‹2ã¤ã®ã‚ªãƒ–ジェクトå‚ç…§ã«å¯¾ã—ã¦ç‰ä¾¡é–¢ä¿‚を実装ã—ã¾ã™ã€‚ - 実装è¦ä»¶:
Objectクラスã®equalsメソッドã¯ã€ã‚‚ã£ã¨ã‚‚比較ã—ã‚„ã™ã„オブジェクトã®åŒå€¤é–¢ä¿‚を実装ã—ã¾ã™ã€‚ã¤ã¾ã‚Šã€null以外ã®å‚照値xã¨yã«ã¤ã„ã¦ã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯xã¨yãŒåŒã˜ã‚ªãƒ–ジェクトをå‚ç…§ã™ã‚‹(x == yãŒtrue)å ´åˆã«ã ã‘trueã‚’è¿”ã—ã¾ã™ã€‚ ã¤ã¾ã‚Šã€å‚ç…§ç‰ä¾¡é–¢ä¿‚ã®ä¸‹ã§ã€å„ç‰ä¾¡ã‚¯ãƒ©ã‚¹ã«ã¯å˜ä¸€ã®è¦ç´ ã®ã¿ãŒã‚りã¾ã™ã€‚- パラメータ:
obj- 比較対象ã®å‚照オブジェクト。- 戻り値:
- ã“ã®ã‚ªãƒ–ジェクトãŒobj引数ã¨åŒã˜ã§ã‚ã‚‹å ´åˆã¯
trueã€ãれ以外ã®å ´åˆã¯false。 - é–¢é€£é …ç›®:
- å射性(reflexive): null以外ã®å‚照値
-
clone
protected Object clone() throws CloneNotSupportedExceptionã“ã®ã‚ªãƒ–ジェクトã®ã‚³ãƒ”ーを作æˆã—ã¦ã€è¿”ã—ã¾ã™ã€‚ 「コピーã€ã®æ£ç¢ºãªæ„味åˆã„ã¯ã€ã‚ªãƒ–ジェクトã®ã‚¯ãƒ©ã‚¹ã«ã‚ˆã£ã¦ç•°ãªã‚Šã¾ã™ã€‚ ä¸€èˆ¬çš„ãªæ„図ã¯ã€ä»»æ„ã®ã‚ªãƒ–ジェクトxã«ã¤ã„ã¦ã€æ¬¡ã®å¼
ãŒtrueã§ã‚ã‚Šã€æ¬¡ã®å¼x.clone() != x
ãŒx.clone().getClass() == x.getClass()
trueã«ãªã‚‹ã“ã¨ã§ã™ãŒã€ã“れらã¯çµ¶å¯¾çš„ãªè¦ä»¶ã§ã¯ã‚りã¾ã›ã‚“。 ã¾ãŸæ¬¡ã®å¼
ãŒx.clone().equals(x)
trueã«ãªã‚Šã¾ã™ãŒã€ã“れã¯çµ¶å¯¾çš„ãªè¦ä»¶ã§ã¯ã‚りã¾ã›ã‚“。慣例上ã€è¿”ã•れãŸã‚ªãƒ–ジェクトã¯ã€
super.cloneを呼ã³å‡ºã™ã“ã¨ã«ã‚ˆã£ã¦å–å¾—ã™ã‚‹ã‚ˆã†ã«ã—ã¦ãã ã•ã„。 クラスã¨ãã®ã™ã¹ã¦ã®ã‚¹ãƒ¼ãƒ‘ー・クラス(Objectを除ã)ãŒã“ã®è¦å‰‡ã«å¾“ã£ã¦ã„ã‚‹å ´åˆã¯ã€x.clone().getClass()== x.getClass()ãŒæˆç«‹ã—ã¾ã™ã€‚通常ã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã«ã‚ˆã‚Šè¿”ã•れるオブジェクトã¯ã€ã“ã®ã‚ªãƒ–ジェクト(複製ã•れã¦ã„ã¾ã™)ã‹ã‚‰ç‹¬ç«‹ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ ã“ã®ç‹¬ç«‹æ€§ã‚’実ç¾ã™ã‚‹ã«ã¯ã€
super.cloneã«ã‚ˆã£ã¦è¿”ã•れãŸã‚ªãƒ–ジェクトを返ã™å‰ã«ã€ãã®1ã¤ä»¥ä¸Šã®ãƒ•ィールドを変更ã™ã‚‹ã“ã¨ãŒå¿…è¦ã«ãªã‚‹å ´åˆãŒã‚りã¾ã™ã€‚ ã“れã¯ã€é€šå¸¸ã€è¤‡è£½ã™ã‚‹ã‚ªãƒ–ジェクトã®å†…éƒ¨ã€Œæ·±å±¤æ§‹é€ ã€ã‚’æ§‹æˆã™ã‚‹å¯å¤‰ã‚ªãƒ–ジェクトã®ã‚³ãƒ”ーã€ãŠã‚ˆã³ã“れらã®ã‚ªãƒ–ジェクトã¸ã®å‚照をコピーã¸ã®å‚ç…§ã«ç½®ãæ›ãˆã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ クラスã«ãƒ—リミティブ・フィールドã¾ãŸã¯ä¸å¤‰ã‚ªãƒ–ジェクトã¸ã®å‚ç…§ã—ã‹å«ã¾ã‚Œã¦ã„ãªã„å ´åˆã¯ã€é€šå¸¸ã€super.cloneã«ã‚ˆã£ã¦è¿”ã•れãŸã‚ªãƒ–ジェクト内ã®ãƒ•ィールドを変更ã™ã‚‹å¿…è¦ãŒã‚りã¾ã›ã‚“。- 実装è¦ä»¶:
- クラス
Objectã®ãƒ¡ã‚½ãƒƒãƒ‰cloneã¯ã€ç‰¹å®šã®ã‚¯ãƒãƒ¼ãƒ‹ãƒ³ã‚°æ“作を実行ã—ã¾ã™ã€‚ ã¾ãšã€ã“ã®ã‚ªãƒ–ジェクトã®ã‚¯ãƒ©ã‚¹ãŒã‚¤ãƒ³ã‚¿ãƒ•ェースCloneableを実装ã—ã¦ã„ãªã„å ´åˆã¯ã€CloneNotSupportedExceptionãŒã‚¹ãƒãƒ¼ã•れã¾ã™ã€‚ ã™ã¹ã¦ã®é…列ãŒã‚¤ãƒ³ã‚¿ãƒ•ェースCloneableを実装ã—ã¦ã„ã‚‹ã¨è¦‹ãªã•れるã“ã¨ã€ãŠã‚ˆã³é…列型T[]ã®cloneãƒ¡ã‚½ãƒƒãƒ‰ã®æˆ»ã‚Šå€¤ã®åž‹ã¯T[](ã“ã“ã§ã€Tã¯ä»»æ„ã®å‚ç…§ã¾ãŸã¯ãƒ—リミティブ型)ã§ã™ã€‚ 実装ã—ã¦ã„ãªã„å ´åˆã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã“ã®ã‚ªãƒ–ジェクトã®ã‚¯ãƒ©ã‚¹ã®æ–°ã—ã„インスタンスを生æˆã—ã€ãã®ãƒ•ィールドをã™ã¹ã¦ã€ã“ã®ã‚ªãƒ–ジェクトã®å¯¾å¿œã™ã‚‹å„フィールドã®å†…容ã§åˆæœŸåŒ–ã—ã¾ã™ã€‚ã“れã¯ä»£å…¥ã¨åŒæ§˜ã§ã€ãƒ•ィールドã®å†…容自身ãŒè¤‡è£½ã•れるã®ã§ã¯ã‚りã¾ã›ã‚“。 ã¤ã¾ã‚Šã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€ã‚ªãƒ–ジェクトã®ã€Œã‚·ãƒ£ãƒãƒ¼ãƒ»ã‚³ãƒ”ーã€ã‚’生æˆã—ã¾ã™ãŒã€ã€Œãƒ‡ã‚£ãƒ¼ãƒ—・コピーã€ã¯ç”Ÿæˆã—ã¾ã›ã‚“。クラス
Object自体ã¯ã‚¤ãƒ³ã‚¿ãƒ•ェースCloneableを実装ã—ã¦ã„ãªã„ãŸã‚ã€ã‚¯ãƒ©ã‚¹ãŒObjectã§ã‚るオブジェクトã«å¯¾ã—ã¦cloneメソッドを呼ã³å‡ºã™ã¨ã€å®Ÿè¡Œæ™‚ã«ä¾‹å¤–ãŒã‚¹ãƒãƒ¼ã•れã¾ã™ã€‚ - 戻り値:
- ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®è¤‡è£½ã€‚
- スãƒãƒ¼:
CloneNotSupportedException- オブジェクトã®ã‚¯ãƒ©ã‚¹ãŒCloneableインタフェースをサãƒãƒ¼ãƒˆã—ã¦ã„ãªã„å ´åˆã€‚cloneメソッドをオーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã—ãŸã‚µãƒ–クラスもã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’複製ã§ããªã„ã“ã¨ã‚’示ã™ãŸã‚ã«ã“ã®ä¾‹å¤–をスãƒãƒ¼ã™ã‚‹ã“ã¨ãŒã‚る。- é–¢é€£é …ç›®:
-
toString
public String toString()ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ–‡å—列表ç¾ã‚’è¿”ã—ã¾ã™ã€‚ ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã®ç¸®å°ã‚’満ãŸã™ã¨ã€null以外ã®çµæžœãŒè¿”ã•れる必è¦ãŒã‚りã¾ã™ã€‚- APIã®ãƒŽãƒ¼ãƒˆ:
- 一般ã«ã€
toStringメソッドã¯ã€ã“ã®ã‚ªãƒ–ジェクトを「テã‚ストã§è¡¨ã™ã€æ–‡å—列を返ã—ã¾ã™ã€‚ ã“ã®çµæžœã¯ã€äººé–“ãŒèªã‚ã‚‹ç°¡æ½”ã§æœ‰ç›Šãªæƒ…å ±ã§ã‚ã‚‹ã¹ãã§ã™ã€‚ ã™ã¹ã¦ã®ã‚µãƒ–クラスã§ã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’オーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ æ–‡å—列ã®å‡ºåŠ›ã¯ã€å¿…ãšã—も時間ã®çµŒéŽã¨ã¨ã‚‚ã«ã€ã¾ãŸã¯JVM呼出ã—全体ã§å®‰å®šã—ã¦ã„ã‚‹ã‚ã‘ã§ã¯ã‚りã¾ã›ã‚“。 - 実装è¦ä»¶:
- クラス
Objectã®toStringメソッドã¯ã€ã‚ªãƒ–ジェクトãŒã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«ãªã£ã¦ã„ã‚‹å…ƒã®ã‚¯ãƒ©ã‚¹ã®åå‰ã€ã‚¢ãƒƒãƒˆãƒžãƒ¼ã‚¯æ–‡å—「@ã€ã€ãŠã‚ˆã³ã‚ªãƒ–ジェクトã®ãƒãƒƒã‚·ãƒ¥ãƒ»ã‚³ãƒ¼ãƒ‰ã®ç¬¦å·ãªã—16進数表ç¾ã‹ã‚‰æ§‹æˆã•れる文å—列を返ã—ã¾ã™ã€‚ ã¤ã¾ã‚Šã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯æ¬¡ã®å€¤ã¨ç‰ã—ã„æ–‡å—列を返ã—ã¾ã™ã€‚getClass().getName() + '@' + Integer.toHexString(hashCode())Objects.toIdentityStringメソッドã¯ã€toStringメソッドもhashCodeメソッドもオブジェクトã®ã‚¯ãƒ©ã‚¹ã«ã‚ˆã£ã¦ã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã•れãªã‹ã£ãŸå ´åˆã«è¿”ã•れる文å—列ã¨ç‰ã—ã„ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ–‡å—列を返ã—ã¾ã™ã€‚ - 戻り値:
- ã“ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ–‡å—列表ç¾
-
notify
public final void notify()ã“ã®ã‚ªãƒ–ジェクトã®ãƒ¢ãƒ‹ã‚¿ãƒ¼ã§å¾…機ä¸ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’1ã¤å†é–‹ã—ã¾ã™ã€‚ ã“ã®ã‚ªãƒ–ジェクトã§è¤‡æ•°ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒå¾…機ä¸ã®å ´åˆã¯ã€ãã®ã†ã¡ã®1ã¤ã‚’å†é–‹ã—ã¾ã™ã€‚ ã“ã®é¸æŠžã¯ä»»æ„ã§ã€å®Ÿè£…ã«ã‚ˆã£ã¦ç•°ãªã‚Šã¾ã™ã€‚ スレッドã¯ã€waitメソッドを呼ã³å‡ºã™ã¨ã€ã‚ªãƒ–ジェクトã®ãƒ¢ãƒ‹ã‚¿ãƒ¼ã§å¾…機ã—ã¾ã™ã€‚å†é–‹ã•れãŸã‚¹ãƒ¬ãƒƒãƒ‰ã®å‡¦ç†ã¯ã€ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒã“ã®ã‚ªãƒ–ジェクトã®ãƒãƒƒã‚¯ã‚’解除ã™ã‚‹ã¾ã§ã¯é€²ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 å†é–‹ã•れãŸã‚¹ãƒ¬ãƒƒãƒ‰ã¯ã€ã»ã‹ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã¨åŒã˜ã‚ˆã†ã«ã€ã“ã®ã‚ªãƒ–ジェクトã¨åŒæœŸã™ã‚‹ã‚ˆã†ã«ç©æ¥µçš„ã«ç«¶ã„ã¾ã™ã€‚ãŸã¨ãˆã°ã€ã“ã®ã‚ªãƒ–ジェクトをãƒãƒƒã‚¯ã™ã‚‹æ¬¡ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã«ãªã‚ã†ã¨ã™ã‚‹å ´åˆã§ã‚‚ã€å†é–‹ã•れãŸã‚¹ãƒ¬ãƒƒãƒ‰ã®æ‰±ã„ã¯ã»ã‹ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã‚ˆã‚Šå„ªå‹¢ã§ã‚‚劣勢ã§ã‚‚ã‚りã¾ã›ã‚“。
ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’呼ã³å‡ºã™ã®ã¯ã€ã“ã®ã‚ªãƒ–ジェクトã®ãƒ¢ãƒ‹ã‚¿ãƒ¼ã‚’所有ã™ã‚‹ã‚¹ãƒ¬ãƒƒãƒ‰ã ã‘ã§ãªã‘れã°ã„ã‘ã¾ã›ã‚“。 スレッドãŒã‚ªãƒ–ジェクトã®ãƒ¢ãƒ‹ã‚¿ãƒ¼ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«ãªã‚‹æ–¹æ³•ã¯ã€æ¬¡ã®3通りãŒã‚りã¾ã™ã€‚
- オブジェクトã®synchronizedインスタンス・メソッドを実行ã™ã‚‹ã€‚
- ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’åŒæœŸåŒ–ã™ã‚‹
synchronizedæ–‡ã®æœ¬ä½“を実行ã™ã‚‹ã€‚ Class,åž‹ã®ã‚ªãƒ–ジェクトã®å ´åˆã€ãã®ã‚¯ãƒ©ã‚¹ã®é™çš„åŒæœŸãƒ¡ã‚½ãƒƒãƒ‰ã‚’実行ã—ã¾ã™ã€‚
オブジェクトã®ãƒ¢ãƒ‹ã‚¿ãƒ¼ã‚’所有ã§ãるスレッドã¯1回ã«1ã¤ã ã‘ã§ã™ã€‚
- スãƒãƒ¼:
IllegalMonitorStateException- ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒã“ã®ã‚ªãƒ–ジェクトã®ãƒ¢ãƒ‹ã‚¿ãƒ¼ã‚’所有ã—ã¦ã„ãªã„å ´åˆã€‚- é–¢é€£é …ç›®:
-
notifyAll
public final void notifyAll()ã“ã®ã‚ªãƒ–ジェクトã®ãƒ¢ãƒ‹ã‚¿ãƒ¼ã§å¾…機ä¸ã®ã™ã¹ã¦ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’å†é–‹ã—ã¾ã™ã€‚ スレッドã¯ã€waitメソッドを呼ã³å‡ºã™ã¨ã€ã‚ªãƒ–ジェクトã®ãƒ¢ãƒ‹ã‚¿ãƒ¼ã§å¾…機ã—ã¾ã™ã€‚å†é–‹ã•れãŸã‚¹ãƒ¬ãƒƒãƒ‰ã®å‡¦ç†ã¯ã€ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒã“ã®ã‚ªãƒ–ジェクトã®ãƒãƒƒã‚¯ã‚’解除ã™ã‚‹ã¾ã§ã¯é€²ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 å†é–‹ã•れãŸã‚¹ãƒ¬ãƒƒãƒ‰ã¯ã€ã»ã‹ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã¨åŒã˜ã‚ˆã†ã«ã€ã“ã®ã‚ªãƒ–ジェクトã¨åŒæœŸã™ã‚‹ã‚ˆã†ã«ç©æ¥µçš„ã«ç«¶ã„ã¾ã™ã€‚ãŸã¨ãˆã°ã€ã“ã®ã‚ªãƒ–ジェクトをãƒãƒƒã‚¯ã™ã‚‹æ¬¡ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã«ãªã‚ã†ã¨ã™ã‚‹å ´åˆã§ã‚‚ã€å†é–‹ã•れãŸã‚¹ãƒ¬ãƒƒãƒ‰ã®æ‰±ã„ã¯ã»ã‹ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã‚ˆã‚Šå„ªå‹¢ã§ã‚‚劣勢ã§ã‚‚ã‚りã¾ã›ã‚“。
ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’呼ã³å‡ºã™ã®ã¯ã€ã“ã®ã‚ªãƒ–ジェクトã®ãƒ¢ãƒ‹ã‚¿ãƒ¼ã‚’所有ã™ã‚‹ã‚¹ãƒ¬ãƒƒãƒ‰ã ã‘ã§ãªã‘れã°ã„ã‘ã¾ã›ã‚“。 スレッドãŒã‚ªãƒ–ジェクトã®ãƒ¢ãƒ‹ã‚¿ãƒ¼ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«ãªã‚‹æ–¹æ³•ã«ã¤ã„ã¦ã¯ã€
notifyメソッドをå‚ç…§ã—ã¦ãã ã•ã„。- スãƒãƒ¼:
IllegalMonitorStateException- ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒã“ã®ã‚ªãƒ–ジェクトã®ãƒ¢ãƒ‹ã‚¿ãƒ¼ã‚’所有ã—ã¦ã„ãªã„å ´åˆã€‚- é–¢é€£é …ç›®:
-
wait
public final void wait() throws InterruptedExceptionç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒç›®è¦šã‚ã‚‹ã¾ã§å¾…機ã—ã¾ã™ã€‚通常ã€notifiedã¾ãŸã¯interruptedã§ã™ã€‚ã™ã¹ã¦ã®ç‚¹ã§ã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯
wait(0L, 0)ãŒå‘¼ã³å‡ºã•れãŸã‹ã®ã‚ˆã†ã«å‹•作ã—ã¾ã™ã€‚ 詳細ã«ã¤ã„ã¦ã¯ã€wait(long, int)メソッドã®ä»•様をå‚ç…§ã—ã¦ãã ã•ã„。- スãƒãƒ¼:
IllegalMonitorStateException- ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒã‚ªãƒ–ジェクトã®ãƒ¢ãƒ‹ã‚¿ãƒ¼ã‚’所有ã—ã¦ã„ãªã„å ´åˆInterruptedException- ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒå¾…機ã—ã¦ã„ãŸå‰ã¾ãŸã¯ä¸ã«ã€ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã«å‰²ã‚Šè¾¼ã¿ãŒç™ºç”Ÿã—ãŸå ´åˆã€‚ ã“ã®ä¾‹å¤–ãŒã‚¹ãƒãƒ¼ã•れるã¨ã€ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã®å‰²è¾¼ã¿ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã¯ã‚¯ãƒªã‚¢ã•れる。- é–¢é€£é …ç›®:
-
wait
public final void wait(long timeoutMillis) throws InterruptedException ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã¯ã€é€šå¸¸ã€notifiedã¾ãŸã¯interruptedã§ã‚ã‚‹ã‹ã€ä¸€å®šã®ãƒªã‚¢ãƒ«ã‚¿ã‚¤ãƒ ãŒçµŒéŽã™ã‚‹ã¾ã§ã€ç›®è¦šã‚ã‚‹ã¾ã§å¾…機ã—ã¾ã™ã€‚ã™ã¹ã¦ã®ç‚¹ã§ã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯
wait(timeoutMillis, 0)ãŒå‘¼ã³å‡ºã•れãŸã‹ã®ã‚ˆã†ã«å‹•作ã—ã¾ã™ã€‚ 詳細ã«ã¤ã„ã¦ã¯ã€wait(long, int)メソッドã®ä»•様をå‚ç…§ã—ã¦ãã ã•ã„。- パラメータ:
timeoutMillis- 待機ã™ã‚‹æœ€å¤§æ™‚é–“(ミリ秒å˜ä½)- スãƒãƒ¼:
IllegalArgumentException-timeoutMillisãŒè² ã®å ´åˆIllegalMonitorStateException- ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒã‚ªãƒ–ジェクトã®ãƒ¢ãƒ‹ã‚¿ãƒ¼ã‚’所有ã—ã¦ã„ãªã„å ´åˆInterruptedException- ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒå¾…機ã—ã¦ã„ãŸå‰ã¾ãŸã¯ä¸ã«ã€ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã«å‰²ã‚Šè¾¼ã¿ãŒç™ºç”Ÿã—ãŸå ´åˆã€‚ ã“ã®ä¾‹å¤–ãŒã‚¹ãƒãƒ¼ã•れるã¨ã€ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã®å‰²è¾¼ã¿ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã¯ã‚¯ãƒªã‚¢ã•れる。- é–¢é€£é …ç›®:
-
wait
public final void wait(long timeoutMillis, int nanos) throws InterruptedException ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã¯ã€é€šå¸¸ã€notifiedã¾ãŸã¯interruptedã§ã‚ã‚‹ã‹ã€ä¸€å®šã®ãƒªã‚¢ãƒ«ã‚¿ã‚¤ãƒ ãŒçµŒéŽã™ã‚‹ã¾ã§ã€ç›®è¦šã‚ã‚‹ã¾ã§å¾…機ã—ã¾ã™ã€‚ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã¯ã€ã“ã®ã‚ªãƒ–ジェクトã®ãƒ¢ãƒ‹ã‚¿ãƒ¼ãƒ»ãƒãƒƒã‚¯ã‚’所有ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ スレッドãŒãƒ¢ãƒ‹ã‚¿ãƒ¼ãƒ»ãƒãƒƒã‚¯ã®æ‰€æœ‰è€…ã«ãªã‚‹æ–¹æ³•ã«ã¤ã„ã¦ã¯ã€
notifyメソッドをå‚ç…§ã—ã¦ãã ã•ã„。ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰(ã“ã“ã§ã¯Tã¨å‘¼ã°ã‚Œã¾ã™)ã‚’ã“ã®ã‚ªãƒ–ジェクトã®å¾…機セットã«é…ç½®ã—ã€ã“ã®ã‚ªãƒ–ジェクトã®åŒæœŸè¦æ±‚ã‚’ã™ã¹ã¦æ”¾æ£„ã—ã¾ã™ã€‚ ã“ã®ã‚ªãƒ–ジェクトã®ãƒãƒƒã‚¯ã ã‘ãŒè§£æ”¾ã•れるã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。スレッドãŒå¾…機ã—ã¦ã„ã‚‹é–“ã€ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒåŒæœŸåŒ–ã•れã¦ã„ã‚‹ä»–ã®ã‚ªãƒ–ジェクトã¯ãƒãƒƒã‚¯ã•れãŸã¾ã¾ã§ã™ã€‚
スレッドTã¯ã‚¹ãƒ¬ãƒƒãƒ‰ã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒªãƒ³ã‚°ã®ç›®çš„ã§ç„¡åйã«ãªã‚Šã€æ¬¡ã®ã„ãšã‚Œã‹ãŒç™ºç”Ÿã™ã‚‹ã¾ã§ä¼‘æ¢çŠ¶æ…‹ã«ãªã‚Šã¾ã™:
- ã»ã‹ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒã“ã®ã‚ªãƒ–ジェクトã«å¯¾ã—ã¦
notifyメソッドを呼ã³å‡ºã—ã€å†é–‹ã•れるスレッドã¨ã—ã¦ã‚¹ãƒ¬ãƒƒãƒ‰TãŒé¸ã°ã‚ŒãŸã€‚ - ã»ã‹ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒã“ã®ã‚ªãƒ–ジェクトã«å¯¾ã—ã¦
notifyAllメソッドを呼ã³å‡ºã—ãŸã€‚ - ã»ã‹ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒã‚¹ãƒ¬ãƒƒãƒ‰Tã«å‰²ã‚Šè¾¼ã¿ã‚’ã‹ã‘る。
- 指定ã•れãŸå®Ÿæ™‚é–“ãŒçµŒéŽã—ãŸã€‚ リアルタイムã®é‡(ナノ秒å˜ä½)ã¯ã€å¼
1000000 * timeoutMillis + nanosã«ã‚ˆã£ã¦ä¸Žãˆã‚‰ã‚Œã¾ã™ã€‚timeoutMillisã¨nanosãŒä¸¡æ–¹ã¨ã‚‚ゼãƒã§ã‚ã‚‹å ´åˆã€å®Ÿæ™‚é–“ã¯è€ƒæ…®ã•れãšã€ã‚¹ãƒ¬ãƒƒãƒ‰ã¯ä»–ã®åŽŸå› ã®1ã¤ã«ã‚ˆã£ã¦èµ·ã“ã•れるã¾ã§å¾…ã¤ã€‚ - スレッドTãŒå½ã£ã¦èµ·ã“ã•れã¾ã™ã€‚ (後述ã®èª¬æ˜Žã‚’å‚ç…§ã—ã¦ãã ã•ã„)
ãã®å¾Œã‚¹ãƒ¬ãƒƒãƒ‰Tã¯ã“ã®ã‚ªãƒ–ジェクトã®å¾…機セットã‹ã‚‰å‰Šé™¤ã•れã€ã‚¹ãƒ¬ãƒƒãƒ‰ã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒªãƒ³ã‚°ãŒãµãŸãŸã³å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ é€šå¸¸ã®æ–¹æ³•ã§ä»–ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã¨ç«¶åˆã—ã€ã‚ªãƒ–ジェクト上ã§åŒæœŸã‚’ã¨ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚オブジェクトã®åˆ¶å¾¡ã‚’回復ã™ã‚‹ã¨ã€ãã®ã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹ã™ã¹ã¦ã®åŒæœŸè¦æ±‚ãŒç¾çŠ¶ç¶æŒã«æˆ»ã•れã¾ã™ - ã¤ã¾ã‚Šã€
waitメソッドãŒå‘¼ã³å‡ºã•ã‚ŒãŸæ™‚点ã®çжæ³ã«æˆ»ã‚Šã¾ã™ã€‚ 次ã«ã‚¹ãƒ¬ãƒƒãƒ‰Tã¯waitメソッドã®å‘¼ã³å‡ºã—ã‹ã‚‰å¾©å¸°ã—ã¾ã™ã€‚ ã“ã†ã—ã¦ã€waitメソッドã‹ã‚‰å¾©å¸°ã—ãŸæ™‚点ã§ã€ã‚ªãƒ–ジェクトãŠã‚ˆã³ã‚¹ãƒ¬ãƒƒãƒ‰Tã®åŒæœŸã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã¯ã€waitメソッドãŒå‘¼ã³å‡ºã•れãŸã¨ãã¨ã¾ã£ãŸãåŒã˜ã«ãªã‚Šã¾ã™ã€‚スレッドã¯ã€é€šçŸ¥ã€ä¸æ–ã¾ãŸã¯ã‚¿ã‚¤ãƒ アウトã™ã‚‹ã“ã¨ãªãã€ã„ã‚ゆる「å½ã®èµ·åºŠã€ã§èµ·å‹•ã§ãã¾ã™ã€‚ スプリアス・ウェイクアップã¯ã€å®Ÿéš›ã«ã¯ã¾ã‚Œã«ã—ã‹ç™ºç”Ÿã—ã¾ã›ã‚“ãŒã€ã‚¢ãƒ—リケーションã§ã¯ã€ã‚¹ãƒ¬ãƒƒãƒ‰ãŒå†é–‹ã•れるã“ã¨ã§ç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹æ¡ä»¶ã‚’テストã—ã€æ¡ä»¶ãŒæº€ãŸã•れãªã„å ´åˆã¯å¾…機を続ã‘ã¦ã€ã‚¹ãƒ—リアス・ウェイクアップã‹ã‚‰ä¿è·ã—ãªã‘れã°ã„ã‘ã¾ã›ã‚“。 次ã®ä¾‹ã‚’å‚ç…§ã—ã¦ãã ã•ã„。
ã“ã®ãƒˆãƒ”ックã®è©³ç´°ã¯ã€Brian Goetzã®14.2ã€"æ¡ä»¶å¾…ã¡è¡Œåˆ—ã€"ã€ãŠã‚ˆã³Joshua Bloch 「Effective Javaã€ç¬¬3版〠(Addison-Wesley, 2018)ã®Java Concurrency in Practice (Addison-Wesley, 2006)ã¾ãŸã¯Item 81ã‚’å‚ç…§ã—ã¦ãã ã•ã„。
ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã®å¾…機ä¸ã¾ãŸã¯å¾…機å‰ã«ä»»æ„ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã‹ã‚‰å‰²ã‚Šè¾¼ã¿ãŒã‹ã‹ã£ãŸå ´åˆã€
InterruptedExceptionãŒã‚¹ãƒãƒ¼ã•れã¾ã™ã€‚ ã“ã®ä¾‹å¤–ãŒã‚¹ãƒãƒ¼ã•れるã¨ã€ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã®å‰²è¾¼ã¿ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã¯ã‚¯ãƒªã‚¢ã•れる。 ã“ã®ä¾‹å¤–ã¯ã€ã“ã®ã‚ªãƒ–ジェクトã®ãƒãƒƒã‚¯ãƒ»ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãŒå‰è¿°ã®ã‚ˆã†ã«å¾©å…ƒã•れるã¾ã§ã¯ã‚¹ãƒãƒ¼ã•れã¾ã›ã‚“。- APIã®ãƒŽãƒ¼ãƒˆ:
- 待機ã™ã‚‹ãŸã‚ã®æŽ¨å¥¨ã•れる方法ã¯ã€ä»¥ä¸‹ã®ä¾‹ã«ç¤ºã™ã‚ˆã†ã«ã€
waitã¸ã®å‘¼ã³å‡ºã—ã®å‘¨ã‚Šã®whileループã§å¾…ã£ã¦ã„る状態をãƒã‚§ãƒƒã‚¯ã™ã‚‹ã“ã¨ã§ã™ã€‚ ã¨ã‚Šã‚ã‘ã€ã“ã®ã‚¢ãƒ—ãƒãƒ¼ãƒã¯ã€å½ã®ã‚¦ã‚§ã‚¤ãƒ»ã‚¯ アップã«ã‚ˆã£ã¦å¼•ãèµ·ã“ã•れるå¯èƒ½æ€§ã®ã‚ã‚‹å•題を回é¿ã—ã¾ã™ã€‚synchronized (obj) { while ( <condition does not hold and timeout not exceeded> ) { long timeoutMillis = ... ; // recompute timeout values int nanos = ... ; obj.wait(timeoutMillis, nanos); } ... // Perform action appropriate to condition or timeout } - パラメータ:
timeoutMillis- 待機ã™ã‚‹æœ€å¤§æ™‚é–“(ミリ秒å˜ä½)nanos- è¿½åŠ æ™‚é–“(ナノ秒) (0ã‹ã‚‰999999 (包å«)ã®ç¯„囲)- スãƒãƒ¼:
IllegalArgumentException-timeoutMillisãŒè² ã®å ´åˆã€ã¾ãŸã¯nanosã®å€¤ãŒç¯„囲外ã®å ´åˆIllegalMonitorStateException- ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒã‚ªãƒ–ジェクトã®ãƒ¢ãƒ‹ã‚¿ãƒ¼ã‚’所有ã—ã¦ã„ãªã„å ´åˆInterruptedException- ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒå¾…機ã—ã¦ã„ãŸå‰ã¾ãŸã¯ä¸ã«ã€ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã«å‰²ã‚Šè¾¼ã¿ãŒç™ºç”Ÿã—ãŸå ´åˆã€‚ ã“ã®ä¾‹å¤–ãŒã‚¹ãƒãƒ¼ã•れるã¨ã€ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã®å‰²è¾¼ã¿ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã¯ã‚¯ãƒªã‚¢ã•れる。- é–¢é€£é …ç›®:
- ã»ã‹ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒã“ã®ã‚ªãƒ–ジェクトã«å¯¾ã—ã¦
-
finalize
@Deprecated(since="9", forRemoval=true) protected void finalize() throws Throwable削除予定ã®ãŸã‚éžæŽ¨å¥¨: ã“ã®APIè¦ç´ ã¯ã€å°†æ¥ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§å‰Šé™¤ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚最終決定ã¯éžæŽ¨å¥¨ã§ã‚りã€å°†æ¥ã®ãƒªãƒªãƒ¼ã‚¹ã§å‰Šé™¤ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ ファイナライズを使用ã™ã‚‹ã¨ã€ã‚»ã‚ュリティã€ãƒ‘フォーマンスãŠã‚ˆã³ä¿¡é ¼æ€§ã®å•題ãŒç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ 詳細ãŠã‚ˆã³ä»£æ›¿æ‰‹æ®µã«ã¤ã„ã¦ã¯ã€JEP 421ã‚’å‚ç…§ã—ã¦ãã ã•ã„。クリーンアップを実行ã™ã‚‹ãŸã‚ã«
finalizeをオーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã™ã‚‹ã‚µãƒ–クラスã¯ã€ä»£æ›¿ã®ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—・メカニズムを使用ã—ã€finalizeメソッドを削除ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ オブジェクトã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªããªã£ãŸå ´åˆã«ãƒªã‚½ãƒ¼ã‚¹ã‚’解放ã™ã‚‹ã‚ˆã‚Šå®‰å…¨ãªæ–¹æ³•ã¨ã—ã¦ã€CleanerãŠã‚ˆã³PhantomReferenceを使用ã—ã¾ã™ã€‚ ã¾ãŸã¯ã€closeãƒ¡ã‚½ãƒƒãƒ‰ã‚’è¿½åŠ ã—ã¦ãƒªã‚½ãƒ¼ã‚¹ã‚’明示的ã«è§£æ”¾ã—ã€AutoCloseableを実装ã—ã¦try-with-resourcesæ–‡ã®ä½¿ç”¨ã‚’有効ã«ã—ã¾ã™ã€‚ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€ãƒ•ァイナライザãŒã»ã¨ã‚“ã©ã®æ—¢å˜ã‚³ãƒ¼ãƒ‰ã‹ã‚‰å‰Šé™¤ã•れるã¾ã§æœ‰åйã§ã™ã€‚
ã“ã®ã‚ªãƒ–ジェクトã¸ã®å‚ç…§ã¯ã‚‚ã†ãªã„ã¨ã‚¬ãƒ™ãƒ¼ã‚¸ãƒ»ã‚³ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã«ã‚ˆã£ã¦åˆ¤æ–ã•れãŸã¨ãã«ã€ã‚¬ãƒ™ãƒ¼ã‚¸ãƒ»ã‚³ãƒ¬ã‚¯ã‚¿ã«ã‚ˆã£ã¦å‘¼ã³å‡ºã•れã¾ã™ã€‚ サブクラスã¯finalizeメソッドをオーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã—ã¦ã€ã‚·ã‚¹ãƒ†ãƒ ãƒ»ãƒªã‚½ãƒ¼ã‚¹ã‚’ç ´æ£„ã—ãŸã‚Šã€ãã®ä»–ã®ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—を行ã£ãŸã‚Šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ファイナライズãŒç„¡åйã¾ãŸã¯å‰Šé™¤ã•れã¦ã„ã‚‹Java仮想マシンã§å®Ÿè¡Œã•れã¦ã„ã‚‹Whenã¯ã€ã‚¬ãƒ™ãƒ¼ã‚¸ãƒ»ã‚³ãƒ¬ã‚¯ã‚¿ãŒ
finalize()をコールã™ã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。 ãƒ•ã‚¡ã‚¤ãƒŠãƒ©ã‚¤ã‚ºãŒæœ‰åйãªJava仮想マシンã§ã¯ã€ã‚¬ãƒ™ãƒ¼ã‚¸ãƒ»ã‚³ãƒ¬ã‚¯ã‚¿ãŒç„¡æœŸé™ã®delay.ã®å¾Œã«ã®ã¿finalizeをコールã™ã‚‹å ´åˆãŒã‚りã¾ã™finalizeã®ä¸€èˆ¬è¦ç´„ã§ã¯ã€ãƒ•ã‚¡ã‚¤ãƒŠãƒ©ã‚¤ã‚ºã®æº–å‚™ãŒã§ãã¦ã„ã‚‹ä»–ã®ã‚ªãƒ–ジェクトã¾ãŸã¯ã‚¯ãƒ©ã‚¹ã®ãƒ•ァイナライズã«ã‚ˆã£ã¦å®Ÿè¡Œã•れãŸã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’除ãã€ã¾ã 終了ã—ã¦ã„ãªã„スレッドãŒã“ã®ã‚ªãƒ–ジェクトã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªã„ã¨Java仮想マシンãŒåˆ¤æ–ã—ãŸå ´åˆã«å‘¼ã³å‡ºã•れã¾ã™ã€‚finalizeメソッドã¯ã€ã“ã®ã‚ªãƒ–ジェクトを別ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã§ãµãŸãŸã³åˆ©ç”¨å¯èƒ½ã«ã™ã‚‹ã“ã¨ã‚‚å«ã‚ã¦ã€ä»»æ„ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’行ã†ã“ã¨ãŒã§ãã¾ã™ã€‚ã—ã‹ã—ã€finalizeã®é€šå¸¸ã®ç”¨é€”ã¯ã€ã‚ªãƒ–ジェクトをå†ç”Ÿä¸å¯èƒ½ãªå½¢ã§ç ´æ£„ã™ã‚‹å‰ã®ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—を実行ã™ã‚‹ã“ã¨ã§ã™ã€‚ ãŸã¨ãˆã°ã€å…¥å‡ºåŠ›ã®æŽ¥ç¶šã‚’è¡¨ã™ã‚ªãƒ–ジェクトã®finalizeメソッドã¯ã€ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆãŒæ°¸ä¹…çš„ã«ç ´æ£„ã•れるå‰ã«ã€æŽ¥ç¶šã‚’切æ–ã™ã‚‹ãŸã‚ã®æ˜Žç¤ºçš„ãªå…¥å‡ºåЛ処ç†ã‚’行ã„ã¾ã™ã€‚Objectクラスã®finalizeメソッドã¯ã€ç‰¹åˆ¥ãªå‡¦ç†ã‚’行ã„ã¾ã›ã‚“。通常ã¯ã€ä½•ã‚‚ã—ãªã„ã§å¾©å¸°ã—ã¾ã™ã€‚Objectã®ã‚µãƒ–クラスã¯ã€ã“ã®å®šç¾©ã‚’オーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚Javaプãƒã‚°ãƒ©ãƒŸãƒ³ã‚°è¨€èªžã¯ã€ä»»æ„ã®ã‚ªãƒ–ジェクトã«ã¤ã„ã¦ã©ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒ
finalizeメソッドを呼ã³å‡ºã™ã‹ã‚’ä¿è¨¼ã—ã¾ã›ã‚“。 ã—ã‹ã—ã€finalizeを呼ã³å‡ºã™ã‚¹ãƒ¬ãƒƒãƒ‰ãŒã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«å¯è¦–ãªåŒæœŸãƒãƒƒã‚¯ã‚’finalize呼出ã—ã®æ™‚点ã§ã¯ä¿æŒã—ã¦ã„ãªã„ã“ã¨ã«ã¤ã„ã¦ã¯ä¿è¨¼ã•れã¾ã™ã€‚ ã‚ャッãƒã•れãªã„例外をfinalizeメソッドãŒã‚¹ãƒãƒ¼ã—ãŸå ´åˆã€ä¾‹å¤–ã¯ç„¡è¦–ã•れã€ã‚ªãƒ–ジェクトã®ãƒ•ァイナライズã¯çµ‚了ã—ã¾ã™ã€‚ã‚るオブジェクトã«ã¤ã„ã¦
finalizeメソッドãŒå‘¼ã³å‡ºã•れãŸã‚ã¨ã«æ¬¡ã®å‡¦ç†ãŒç™ºç”Ÿã™ã‚‹ã®ã¯ã€ã¾ã 生å˜ã—ã¦ã„ã‚‹ä»»æ„ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒã“ã®ã‚ªãƒ–ジェクトã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãる方法ã¯ãªã„ã¨ã€Java Virtual MachineãŒãµãŸãŸã³åˆ¤æ–ã—ãŸã¨ãã§ã™ã€‚ã“れã«ã¯ã€ãƒ•ã‚¡ã‚¤ãƒŠãƒ©ã‚¤ã‚ºã®æº–å‚™ãŒã§ãã¦ã„ã‚‹ã»ã‹ã®ã‚ªãƒ–ジェクトã¾ãŸã¯ã‚¯ãƒ©ã‚¹ã«ã‚ˆã£ã¦ç™ºç”Ÿã—ãŸå‡¦ç†ã‚‚å«ã¾ã‚Œã€ãã®æ™‚点ã§ã“ã®ã‚ªãƒ–ジェクトã¯ç ´æ£„ã•れã¾ã™ã€‚ä»»æ„ã®ã‚ªãƒ–ジェクトã«ã¤ã„ã¦Java Virtual MachineãŒ
finalizeメソッドを複数回呼ã³å‡ºã™ã“ã¨ã¯ã‚りã¾ã›ã‚“。finalizeメソッドã«ã‚ˆã£ã¦ä¾‹å¤–ãŒã‚¹ãƒãƒ¼ã•れるã¨ã€finalizeメソッドã®å‡¦ç†ã¯åœæ¢ã•れã¾ã™ã€‚ãã†ã§ãªã„å ´åˆã¯ç„¡è¦–ã•れã¾ã™ã€‚- APIã®ãƒŽãƒ¼ãƒˆ:
- ヒープ以外ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’埋ã‚込むクラスã«ã¯ã€ãれらã®ãƒªã‚½ãƒ¼ã‚¹ã‚’クリーンアップã™ã‚‹ãŸã‚ã®å¤šãã®ã‚ªãƒ—ションãŒã‚りã¾ã™ã€‚ クラスã¯ã€å„インスタンスã®å˜ç¶šæœŸé–“ãŒã€ãã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ãŒåŸ‹ã‚込むリソースã®å˜ç¶šæœŸé–“よりも長ã„ã“ã¨ã‚’確èªã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
Reference.reachabilityFence(java.lang.Object)を使用ã™ã‚‹ã¨ã€ã‚ªãƒ–ジェクトã«åŸ‹ã‚è¾¼ã¾ã‚ŒãŸãƒªã‚½ãƒ¼ã‚¹ãŒä½¿ç”¨ã•れã¦ã„ã‚‹é–“ã«ã€ã‚ªãƒ–ジェクトãŒåˆ°é”å¯èƒ½ã§ã‚ã‚‹ã“ã¨ã‚’ä¿è¨¼ã§ãã¾ã™ã€‚サブクラスã¯ã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ãŒåŽé›†ã•れるå‰ã«ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—ã™ã‚‹å¿…è¦ãŒã‚ã‚‹éžãƒ’ープ・リソースをサブクラスã«åŸ‹ã‚è¾¼ã¾ãªã„ã‹ãŽã‚Šã€
finalizeメソッドã®ã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã‚’回é¿ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ ファイナライザã®èµ·å‹•ã¯ã€ã‚³ãƒ³ã‚¹ãƒˆãƒ©ã‚¯ã‚¿ã¨ã¯ç•°ãªã‚Šã€è‡ªå‹•çš„ã«é€£éŽ–ã•れるã“ã¨ã¯ã‚りã¾ã›ã‚“。 サブクラスãŒfinalizeをオーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã™ã‚‹å ´åˆã€ã‚¹ãƒ¼ãƒ‘ークラス・ファイナライザを明示的ã«å‘¼ã³å‡ºã™å¿…è¦ãŒã‚りã¾ã™ã€‚ ファイナライズ・ãƒã‚§ãƒ¼ãƒ³ã‚’途ä¸ã§çµ‚了ã™ã‚‹ä¾‹å¤–ã‹ã‚‰ä¿è·ã™ã‚‹ã«ã¯ã€ã‚µãƒ–クラスã§try-finallyブãƒãƒƒã‚¯ã‚’使用ã—ã¦ã€super.finalize()ãŒå¸¸ã«å‘¼ã³å‡ºã•れるよã†ã«ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ ãŸã¨ãˆã°ã€@Override protected void finalize() throws Throwable { try { ... // cleanup subclass state } finally { super.finalize(); } } - スãƒãƒ¼:
Throwable- ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã§ç”Ÿã˜ãŸException- Java言語仕様をå‚ç…§ã—ã¦ãã ã•ã„:
-
12.6 クラス・インスタンスã®ãƒ•ァイナライズ
- é–¢é€£é …ç›®:
-