ããã«ã¡ã¯
Java Coreé éæè²ã³ãŒã¹ã®è©³çްãªç ç©¶ã®äžç°ãšããŠãäžé£ã®åºçç©ãå·çããæã人æ°ã®ããèšäºã®ããã€ãã翻蚳ããŠããŸãã
ãªã³ã©ã€ã³æè²ãã©ãããã©ãŒã udemy.comã§
Scala for Java Developersã³ãŒã¹ãæã
ãŠããŸãïŒCoursera / EdXã«äŒŒãŠããŸãïŒã
ããã§ã
ãã¢ãµãŒã·ã§ã³ã䜿çšããããã°ã©ãã³ã°ãã®ç¿»èš³ãããã€ãã®ã³ã¡ã³ããšãšãã«æ€èšããŠãã ããã
ãªãªãžãã«ã®åºçç©ã¯ãJavaã§
assertããŒã¯ãŒãã䜿çšãããªãã·ã§ã³ãšãã¯ã©ã¹ããŒãã£ã³ã°ã¬ãã«ã§ãã®ã¡ã«ããºã ã®ãµããŒããã©ã®ããã«å®è£
ããããã詳现ã«èª¬æããŠããã ãã§ãªãã
Design-by-Contractã®ããéå
¬åŒã®ç޹ä»ã§ããããŸãã
ãã®ä»ã®Java Coreã®èšäºãšç¿»èš³ Multicore Javaããã°ã©ãã³ã°ã³ãŒã¹ã®ä»ã®èšäºãšç¿»èš³ PSèè
ã¯ãå人çã«ã¯ãã·ã¢èªãJavaèšèªãããã¯ããã«è€éã§ããããšãèªããæ°ä»ãããã¹ãŠã®ãšã©ãŒã«ã€ããŠPMã«æè¬ããŠè³ãåŸããã§ããã ãæ©ãä¿®æ£ããããšããŸãã
ã¢ãµãŒã·ã§ã³ããã°ã©ãã³ã°ïŒoracle.comïŒã¢ãµãŒã·ã§ã³ã䜿çšããããã°ã©ãã³ã°ïŒã¢ãµãŒããšã¯ãããã°ã©ã ã«é¢ããä»®å®ããã¹ãã§ããJavaããã°ã©ãã³ã°èšèªã®ã¹ããŒãã¡ã³ãã§ãã ããšãã°ãããŒãã£ã¯ã«ã®é床ãèšç®ããã¡ãœãããèšè¿°ããå Žåãèšç®ãããé床ãå
ã®é床ãããé
ããšã䞻匵ãã§ããŸãã
åã¹ããŒãã¡ã³ãã«ã¯ãããªãã®æèŠã§ã¯ãå®è¡æã«çã«ãªãè«çåŒãå«ãŸããŠããŸãã ããã§ãªãå Žåãã·ã¹ãã ã¯äŸå€ãã¹ããŒããŸãã è«çåŒãå®éã«çã§ããããšãæ€èšŒããããšã«ãããã¢ãµãŒãã¯ããã°ã©ã ã®åäœã«é¢ããä»®å®ã確èªããããã°ã©ã ã«ãšã©ãŒããªããšãã確信ãé«ããŸãã
ããã°ã©ãã³ã°ã§ã¹ããŒãã¡ã³ããæžãããšã¯ããšã©ãŒãæ€åºããŠä¿®æ£ããããã®æéãã€æã广çãªæ¹æ³ã®1ã€ã§ããããšãçµéšã«ãã瀺ãããŠããŸãã 远å ã®å©ç¹ãšããŠãã¹ããŒãã¡ã³ãã¯ãããã°ã©ã ã®å
éšåäœãææžåããä¿å®æ§ãé«ããã®ã«åœ¹ç«ã¡ãŸãã
ãã®èšäºã§ã¯ãã¹ããŒãã¡ã³ãã䜿çšããŠããã°ã©ã ããæ¹æ³ã瀺ããŸãã æ¬¡ã®ãããã¯ã«ã€ããŠèª¬æããŸãã
ã¯ããã«ã³ãŒããžã®ã¹ããŒãã¡ã³ãã®åã蟌ã¿ã¯ã¬ãŒã ã䜿çšãããã¡ã€ã«ã®ã³ã³ãã€ã«ã¯ã¬ãŒã ã®æå¹åãšç¡å¹åæ¢åã®ããã°ã©ã ãšã®äºææ§èšèšã«é¢ãããããã質åã¯ããã«
assertæã«ã¯2ã€ã®åœ¢åŒããããŸãã æåã®ãããåçŽãªåœ¢åŒã¯æ¬¡ã®ãšããã§ãã
assert Expression1;
åŒ1ã¯ããŒã«åŒã§ãã ã·ã¹ãã ãã¹ããŒãã¡ã³ãããã§ãã¯ãããšãã
åŒ1ãè©äŸ¡ãããããfalseïŒ
false ïŒã®å Žåãã·ã¹ãã ã¯è©³çްãªãšã©ãŒã¡ãã»ãŒãžãªãã§
java.lang.AssertionErrorãã¹ããŒã
ãŸã ã
æ¿èªã®2çªç®ã®åœ¢åŒã¯æ¬¡ã®ãšããã§ãã
assert Expression1 : Expression2;
ããã§ïŒ
- åŒ1ã¯è«çåŒã§ãã
- åŒ2ã¯éèŠãªåŒã§ãïŒ voidã¡ãœãããåŒã³åºãããšã¯ã§ããŸããïŒã
ãã®ããŒãžã§ã³ã®assertã¹ããŒãã¡ã³ãã䜿çšããŠã詳现ãªãšã©ãŒã¡ãã»ãŒãžãæäŸããŸãã ã·ã¹ãã ã¯ãåŒ
2ã®å€ãé©åãª
AssertionErrorã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ããŠãå€ã®æåå衚çŸã詳现ãªãšã©ãŒã¡ãã»ãŒãžãšããŠäœ¿çšããŸãã
翻蚳è
ã³ã¡ã³ãAssertErrorã«ã¯ãåããŒã¿åã®åå¥ã®ã³ã³ã¹ãã©ã¯
ã¿ãŒãå«ãŸããŠããŸãïŒshortãšbyteã¯èªåçã«intã«ãã£ã¹ããããã³ã³ã¹ãã©ã¯ã¿ãŒã¯æäŸãããŸããã§ããïŒ
package java.lang; public class AssertionError extends Error { ... public AssertionError(Object detailMessage) {...} public AssertionError(boolean detailMessage) {...} public AssertionError(char detailMessage) {...} public AssertionError(int detailMessage) {...} public AssertionError(long detailMessage) {...} public AssertionError(float detailMessage) {...} public AssertionError(double detailMessage) {...} ... }
ããã«ãã
ãä»»æã®ããªããã£ãåãŸãã¯åç
§åã®åŒã
åŒ2ãšããŠ
䜿çšã§ããŸã
ã
public class App { public static void main(String[] args) { assert args != null : 1; assert args != null : 1.0; assert args != null : false; assert args != null : "Hello!"; assert args != null : new int[] {10, 20, 30}; }
ãŸãã¯äœããè¿ãä»»æã®ã¡ãœããã®åŒã³åºã
public class App { public static void main(String[] args) { assert args != null : f0(); assert args != null : f1(); assert args != null : f2(); assert args != null : f3(); assert args != null : f4(); } private static byte f0() {return 0;} private static double f1() {return 0.0;} private static boolean f2() {return true;} private static String f3() {return "Hello!";} private static int[] f4() {return new int[] {10, 20, 30};} }
ãã ããvoidãè¿ãã¡ãœãããåŒã³åºããŠããªã
public class App { public static void main(String[] args) { assert args != null : f(); // } private static void f() {} } >> COMPILATION ERROR: 'void' type is not allowed here
ãã®ãããªãšã©ãŒã¡ãã»ãŒãžã®ç®çã¯ãã¹ããŒãã¡ã³ãéåã®çç±ã«é¢ããæ
å ±ãèšé²ããã³å ±åããããšã§ãã ãã®ã¡ãã»ãŒãžã«ããã蚺æãå¯èœã«ãªããæçµçã«ãã¹ããŒãã¡ã³ãã倱æããåå ãšãªã£ããšã©ãŒãæé€ã§ããã¯ãã§ãã ãã®ã¡ãã»ãŒãžã¯ããŠãŒã¶ãŒã«å¯Ÿãããšã©ãŒã¡ãã»ãŒãžã§ã¯ãªãããšã«æ³šæããŠãã ããã äžè¬ã«ããããã®ã¡ãã»ãŒãžãç¬èªã«çè§£å¯èœã«ããå¿
èŠããåœéåããïŒãŠãŒã¶ãŒã®èšèªã«ç¿»èš³ããïŒå¿
èŠããããŸããã 詳现ã¡ãã»ãŒãžã¯ã倱æããã¹ããŒãã¡ã³ããå«ããœãŒã¹ã³ãŒããšçµã¿åãããŠãå®å
šãªã¹ã¿ãã¯ãã¬ãŒã¹ã®ã³ã³ããã¹ãã§è§£éããå¿
èŠããããŸãã
ãã¹ãŠã®æªåŠçã®äŸå€ãšåæ§ã«ãã¢ãµãŒã·ã§ã³ãšã©ãŒã«ã¯éåžžããã¡ã€ã«çªå·ãšããããã¹ããŒãããè¡ãå«ãã¹ã¿ãã¯ãã¬ãŒã¹ãå«ãŸããŸãã ããã°ã©ã ã«é害ã®èšºæã«åœ¹ç«ã€è¿œå æ
å ±ãããå Žåã«ã®ã¿ã2çªç®ã®åœ¢åŒã®æ¿èªãæåã®åœ¢åŒãããåªå
ããŠäœ¿çšããå¿
èŠããããŸãã ããšãã°ã
åŒ1ã«2ã€ã®x倿°ãšy倿°ã®é¢ä¿ãå«ãŸããå Žåã2çªç®ã®åœ¢åŒã䜿çšããå¿
èŠããããŸãã ãããã®æ¡ä»¶äžã§ã¯ã
åŒ2ã®åççãªå€æ°ã¯
"xïŒ" + x + "ãyïŒ" + yã«ãªããŸãã
翻蚳è
ã³ã¡ã³ãããã¯ãããšãã°æ¬¡ã®äŸãåç
§ããŸãã
class App { public static void f(){ int x, y;
ã¹ããŒãã¡ã³ãéåïŒx> yïŒãçºçãããšãåã«
AsertionErrorãã¹ããŒããŸãã
ãããããã®ãããªäŸ
class App { public static void f(){ int x, y;
ãxïŒ0ãyïŒ123ããªã©ã®ã¡ãã»ãŒãžãå«ã
AsertionErrorãã¹ããŒããŸã
ãããã«ãããããã°ã©ãã¯èšç®æã«ç¹å®ã®ç¡å¹ãªxããã³yã®å€ãåæã§ããŸãã
å Žåã«ãã£ãŠã¯ã
åŒ1ã®èšç®ã«ã³ã¹ãããããããšããããŸãã ããšãã°ããœãŒããããŠããªããªã¹ãã®æå°èŠçŽ ã®ã·ãŒã«ãŒã¡ãœãããèšè¿°ãããšãã«ãéžæããèŠçŽ ãå®éã«æå°ã§ããããšã確èªããã¹ããŒãã¡ã³ãã远å ããããšããŸãã ãã®å Žåãã¹ããŒãã¡ã³ãã®æ€èšŒã¯ãã¡ãœããèªäœã®å®è¡ãšåãããããé«äŸ¡ãã«ãªããŸãã ã¹ããŒãã¡ã³ããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæãªããªãããã«ããããã«ãããã°ã©ã ã®èµ·åæã«ã¹ããŒãã¡ã³ããæå¹ãŸãã¯ç¡å¹ã«ããããšãã§ããŸãã ããã©ã«ãã§ã¯ç¡å¹ã«ãªã£ãŠããŸãã æ¿èªãç¡å¹ã«ãããšãããã©ãŒãã³ã¹ã®äœäžãå®å
šã«ãªããªããŸãã ç¡å¹ã«ãããšãã»ãã³ãã£ã¯ã¹ãšããã©ãŒãã³ã¹ã®ç¹ã§ç©ºã®ã¹ããŒãã¡ã³ããšåçã«ãªããŸãã 詳现ã«ã€ããŠã¯ãã
ã¯ã¬ãŒã ã®æå¹åãšç¡å¹åããåç
§ããŠãã ããã
翻蚳è
ã³ã¡ã³ãArrayUtils.minïŒint []ïŒã¡ãœããã§ã¯ããã¹ãã€ã³ããªã¢ã³ãã®2ã€ã®ãã§ãã¯ãšè€éãã®äž¡æ¹ããæå°èŠçŽ ãèŠã€ããè€éãïŒOïŒNïŒïŒãšé£ãåã£ãŠããŸãã
public class ArrayUtils { public static int min(int[] array) { int min; // // min - array assert checkMin(array, min); assert checkContains(array, min); return min; } // , private static boolean checkMin(int[] array, int min) { for (int elem : array) { if (elem < min) { return false; } } return true; } // , "" private static boolean checkContains(int[] array, int min) { for (int elem : array) { if (elem == min) { return true; } } return false; } }
翻蚳è
ã³ã¡ã³ãç©ºã®æŒç®åã¯ãæããã«ãã»ãã³ãã³ãïŒ;ïŒæŒç®åãæå³ããŸã
public class App { public static void main(String[] args) { ;;;; ;;;;;;;; ;;; ;; ;;; ;;;;;;;;;; ;; ;; ;;;;;;;; ;;;; for (int k = 0; k < 10; k++) { ; } } }
assertããŒã¯ãŒããJavaã«è¿œå ãã
ãš ãæ¢åã®ã³ãŒãã«åœ±é¿ããããŸãã 詳现ã«ã€ããŠã¯
ãæ¢åã®ããã°ã©ã ãšã®
äºææ§ãåç
§ããŠãã ããã
ã³ãŒããžã®ã¹ããŒãã¡ã³ãã®åã蟌ã¿
次ã®ãããªã¹ããŒãã¡ã³ãã䜿çšãããšäŸ¿å©ãªç¶æ³ãå€ããããŸãã
ãããã䜿çšãã¹ãã§ã¯ãªãç¶æ³ããããŸãã
翻蚳è
ã³ã¡ã³ãå¯äœçšïŒå¯äœçšïŒ-ãèŠããäžçããå€ããã¢ã¯ã·ã§ã³ã
åçŽã«
tmp x = 1 + 2 + 3;
ãç®ã«èŠããªãäžçãã倿ŽããŸããïŒä»¥äžã®èª°ãããã°ã©ã ã§tmpèå¥åã䜿çšããªãå ŽåïŒ
ãã«ãã£ã«ã¡ã³ã
System.out.printlnïŒ "HelloïŒ"ïŒ;
ãç®ã«èŠããäžçãã倿ŽããŸãïŒå¯äœçšããããŸãïŒ-ãã®ãããªè¡ãæã€ããã°ã©ã ã¯æããã«ã³ã³ãœãŒã«ã«ããã£ãšãåºåããŸãããããã§ãäžã®ããã°ã©ã ã«ã¯åœ±é¿ããŸãã-èªã¿åãããŒã¿ã¯å€æŽããŸããã
ããããè¡
tmp = 2 * tmp;
tmp倿°ã®å€ãèªã¿åã£ãŠäœ¿çšãããšã以äžã®ããã°ã©ã ã«åœ±é¿ããŸãïŒå¯äœçšããããŸãïŒã
å
éšäžå€é
èšèªã§ã¹ããŒãã¡ã³ãã䜿çšå¯èœã«ãªãåã«ãå€ãã®ããã°ã©ããŒã¯ã³ã¡ã³ãã䜿çšããŠãããã°ã©ã ã®åäœã«é¢ããä»®å®ããè¿°ã¹ããŸããã ããšãã°ãif-elseif-elseif- ...ã®é·ããã§ãŒã³å
ã®elseã»ã¯ã·ã§ã³ã«é¢ããä»®å®ãé瀺ããã«ã¯ã 以åã«ãã®ãããªãã®ãæžããïŒ
if (i % 3 == 0) { ... } else if (i % 3 == 1) { ... } else{
ãã
ã§ãåã³ã¡ã³ãã®ä»£ããã«ãæããã«çã®ã¹ããŒãã¡ã³ããã䜿çšããã¹ããŒãã¡ã³ãã䜿çšãã䟡å€ããããŸãã ããšãã°ãåã®ã³ãŒããæ¬¡ã®ããã«æžãæããŸãã
if (i % 3 == 0) { ... } else if (i % 3 == 1) { ... } else { assert i % 3 == 2 : i; ... }
'i'ãè² ã®å ŽåãïŒ
æŒç®åã¯å°äœãèšç®ãããããäžèšã®äŸã®ã¹ããŒãã¡ã³ãã¯å€±æããå¯èœæ§ãããããšã«æ³šæããŠãã ããã
翻蚳è
ã³ã¡ã³ãäžäŸ
ã¹ããŒãã¡ã³ãã䜿çšããå¥ã®åè£ã¯ãããã©ã«ãã®ã»ã¯ã·ã§ã³åãæ¿ãã¹ããŒãã¡ã³ãã§ãã éåžžãããã©ã«ãã»ã¯ã·ã§ã³ããªãããšã¯ãã±ãŒã¹ã»ã¯ã·ã§ã³ã®1ã€ãåžžã«éžæããããšããããã°ã©ãã®èªä¿¡ã瀺ããŠããŸãã 倿°ãå°æ°ã®å€ã®1ã€ãæã€ãšããä»®å®ã¯äžå€ã§ãããã¹ããŒãã¡ã³ãã䜿çšããŠæ€èšŒããå¿
èŠããããŸãã ã«ãŒãã²ãŒã ãæ±ãããã°ã©ã ã«æ¬¡ã®switchã¹ããŒãã¡ã³ãã衚瀺ããããšããŸãã
switch(suit) { caseSuit.CLUBS: // ... break; caseSuit.DIAMONDS: // ... break; caseSuit.HEARTS: // ... break; caseSuit.SPADES: // ... }
ã»ãšãã©ã®å Žåãããã¯ã¹ãŒãå倿°ã4ã€ã®å€ã®ãããããæã€ãšããä»®å®ã瀺ããŠããŸãã ãã®ä»®å®ããã¹ãããã«ã¯ã次ã®ããã©ã«ãã»ã¯ã·ã§ã³ã远å ããŸãã
default: assert false : suit;
倿°ã®ã»ãããç°ãªãå€ãæ³å®ããã¢ãµãŒã·ã§ã³ãå«ãŸããŠããå Žåãã¢ãµãŒã·ã§ã³ã¯å€±æãã
AssertionErroräŸå€ãã¹ããŒããŸãã
蚱容ããããªãã·ã§ã³ã¯æ¬¡ã®ãšããã§ãã
default: throw new AssertionError(suit);
ãã®ã€ãã£ãªã ã¯ãã¯ã¬ãŒã ãç¡å¹ã«ãªã£ãŠããå Žåã§ãä¿è·ãæäŸããŸãã ãããŠããã®è¿œå ã®ä¿è·ã¯äœã®äŸ¡å€ããããŸããïŒ
throwã¹ããŒãã¡ã³ãã¯ãããã°ã©ã ãã¯ã©ãã·ã¥ããå Žåã«ã®ã¿å®è¡ãããŸãã ããã«ããã®ãªãã·ã§ã³ã¯ã
ã¢ãµãŒããç¡å¹ãªç¹å®ã®ç¶æ³ã§æå¹ã§ãã ã¡ãœãããã¡ãœãããè¿ãå Žåãswitchã¹ããŒãã¡ã³ãã®åã±ãŒã¹ã«returnãå«ãŸããåãæ¿ãåŸã«æ»ãçµæããªãå Žåãæåã®ãªãã·ã§ã³ã¯æ§æãšã©ãŒã«ãªããŸãã
翻蚳è
ã³ã¡ã³ããã®ããã°ã©ã ã¯ã³ã³ãã€ã«äžã§ã
public class App { public static int twice(int arg) { switch (arg) { case 0: return 0; case 1: return 2; case 2: return 4; case 3: return 6; default: throw new AssertionError(arg); } } }
ããããããã¯ããã§ã¯ãããŸãã
class App { public static int twice(int arg) { switch (arg) { case 0: return 0; case 1: return 2; case 2: return 4; case 3: return 6; default: assert false : arg; } } } COMPILATION ERROR: Missing return statement
å®è¡æäžå€åŒ
åã®äŸã§ã¯ãäžå€åŒããã¹ããããã ãã§ãªããå®è¡ã®ã¹ã¬ããã«é¢ããä»®å®ããã§ãã¯ããŸãã å
ã®switchã¹ããŒãã¡ã³ãã®äœæè
ã¯ã
suit倿°ãåžžã«4ã€ã®å€ã®ãããããåžžã«æã€ã ãã§ãªããcaseã»ã¯ã·ã§ã³ã®1ã€ã«ãé²ããããšãæ³å®ããŠããŸãã ãã
ã¯ãã¹ããŒãã¡ã³ãã䜿çšããå¿
èŠãããå¥ã®é åãæããŸãã
決ããŠå°éããªããšæãããå Žæã«ã¹ããŒãã¡ã³ããé
眮ããŸãã æ¬¡ã®ã¹ããŒãã¡ã³ãã䜿çšããå¿
èŠããããŸãã
assert false;
次ã®ã¡ãœããããããšããŸãïŒ
void foo() { for (...) { if (...) {return;} ... }
ã³ãŒããæ¬¡ã®ããã«ãªãããã«ãæçµã³ã¡ã³ãã眮ãæããå¿
èŠããããŸãã
void foo() { for (...) { if (...) {return;} } assert false;
泚ïŒãã®æ¹æ³ã¯æ³šæããŠäœ¿çšããŠãã ããã Java仿§ã«åŸã£ãŠç¶æ
ã䜿çšäžå¯ã§ãããšå€æãããå Žåãã¹ããŒãã¡ã³ããããã«é
眮ããããšãããšãã³ã³ãã€ã«æãšã©ãŒã衚瀺ãããŸãã ç¹°ãè¿ãã«ãªããŸãããåãå
¥ãå¯èœãªä»£æ¿ææ®µã¯AssertionErrorãã¹ããŒããããšã§ãã
翻蚳è
ã³ã¡ã³ãJava仿§ã«ãããšãã³ã³ãã€ã©ã¯ã䜿çšäžå¯ãã®æŒç®åããã§ãã¯ããå¿
èŠããããŸãã ãã¢ã¯ã»ã¹ã§ããªããæŒç®åãæ€åºããããšãã³ã³ãã€ã«ãšã©ãŒãçºçããŸãã åææ¡ä»¶ïŒå®è¡ãããªãã¹ããŒãã¡ã³ããå«ãããã°ã©ã ã¯ãããã°ã©ããŒãšã©ãŒã®çµæã§ããå¯èœæ§ãé«ã
public class App { public static void main(String[] args) { return; return;
æ€èšŒã«ãŒã«ã¯å³å¯ã«èšè¿°ãããŠãããèãããããã¹ãŠã®ç¶æ³ãå«ãŸããŠããããã§ã¯ãããŸããã ã³ã³ãã€ã©ããã ãŸããã®ã¯ãšãŠãç°¡åã ãšèšã£ãŠã¿ãŸãããã
public class App { public static void main(String[] args) { if (true) {return;} return;
åææ¡ä»¶ãäºåŸæ¡ä»¶ïŒäºåŸæ¡ä»¶ïŒã¯ã©ã¹äžå€æ¡ä»¶
assertã³ã³ã¹ãã©ã¯ãã¯ãå¥çŽããšã®èšèšã®ããã®æ¬æ Œçãªæ©äŒãæäŸãããã®ã§ã¯ãããŸããããéå
¬åŒã®å¥çŽããšã®ããã°ã©ãã³ã°ã¹ã¿ã€ã«ãç¶æããã®ã«åœ¹ç«ã¡ãŸãã ãã®ã»ã¯ã·ã§ã³ã§ã¯ã次ã®ãããªç¶æ³ã§ã¹ããŒãã¡ã³ãã䜿çšããæ¹æ³ã瀺ããŸãã
åææ¡ä»¶
æ
£äŸã«ããããããªãã¯ã¡ãœããã®åææ¡ä»¶ã¯ãç¹å®ã®ç¹å®ã®äŸå€ãã¹ããŒãããã§ãã¯ãçæããŸãã äŸïŒ
public void setRefreshRate(int rate) { // if (rate <= 0 || rate > MAX_REFRESH_RATE) throw new IllegalArgumentException("Illegal rate: " + rate); setRefreshInterval(1000 / rate); }
ãã®èŠåã¯ãassertã¹ããŒãã¡ã³ãã远å ãããŠã倿ŽãããŸããã§ããã
ã¹ããŒãã¡ã³ãã䜿çšããŠããããªãã¯ã¡ãœããã®ãã©ã¡ãŒã¿ãŒã確èªããªãã§ãã ãã ã ã¡ãœããã¯åŒæ°ãåžžã«ãã§ãã¯ããããšãä¿èšŒããããããã®å Žåã®ã¹ããŒãã¡ã³ãã®äœ¿çšã¯äžé©åã§ãã 圌ã¯ãã¹ããŒãã¡ã³ããç¬ç«æ§ã«å«ãŸããŠãããã©ããã®è°è«ããã§ãã¯ããªããã°ãªããŸããã ããã«ãæå®ãããã¿ã€ãã®äŸå€ãã¹ããŒããããã«ãassertã³ã³ã¹ãã©ã¯ããæå®ããããšã¯ã§ããŸããã
AssertionErrorã®ã¿ãçæã§ããŸãã
ãã ããæã䜿çšããŠéãããªãã¯ã¡ãœããã®åææ¡ä»¶ããã¹ãããããšãã§ããŸããããã¯ãèšç®æã«ãã¯ã©ã€ã¢ã³ããã¯ã©ã¹ã§äœãããŠãé¢ä¿ãªãå®è¡ãããŸãã ããšãã°ãåã®ãããªãã¯ã¡ãœããã«ãã£ãŠåŒã³åºãããæ¬¡ã®ãã«ããŒã¡ãœããã§ã¯ãã¹ããŒãã¡ã³ããé©åã§ãã
private void setRefreshInterval(int interval) {
泚ïŒ
MAX_REFRESH_RATEã 1000ãè¶
ããå ŽåããŸãã¯ã¯ã©ã€ã¢ã³ãã1000ãè¶
ããæŽæ°ã¬ãŒããéžæããå Žåããã®ã¹ããŒãã¡ã³ãã¯å€±æããŸããå®éãããã¯ã©ã€ãã©ãªãŒã®ãšã©ãŒã瀺ããŠããŸãã
ããã¯ç¶æ
ã®åææ¡ä»¶
ãã«ãã¹ã¬ããã§ã®äœ¿çšãç®çãšããã¯ã©ã¹ã«ã¯ãããã€ãã®ããã¯ãååŸããããããŸãã¯ãã®éã®èªç±ããããšããåææ¡ä»¶ãæã€éãããªãã¯ã¡ãœããããã°ãã°ãããŸãã ãã®ãããªãã®ãèŠãããšã¯çãããããŸããïŒ
privateObject[] a; public synchronized int find(Object key) { return find(key, a, 0, a.length); } / / - c private int find(Object key, Object[] arr, int start, int len) { ... }
holdLockïŒObjectïŒãšããéçã¡ãœããã
Threadã¯ã©ã¹ã«è¿œå ãããçŸåšã®ã¹ã¬ãããæå®ããããªããžã§ã¯ãã®ããã¯ãä¿æããŠãããã©ããããã¹ãããŸãã ãã®ã¡ãœããã¯ã次ã®äŸã«ç€ºãããã«ãã³ã¡ã³ããè£è¶³ããã¹ããŒãã¡ã³ããšçµã¿åãããŠäœ¿çšââã§ããŸãã
/ / : private int find(Object key, Object[] arr, int start, intlen) { assert Thread.holdsLock(this);
ãŸããããã¯ã
ãã£ããã£ãããªããšããã¹ããŒãã¡ã³ããèšè¿°ããããšãã§ããŸãã
äºåŸæ¡ä»¶
ãããªãã¯ã¡ãœãããšéãããªãã¯ã¡ãœããã®äž¡æ¹ã®ã¹ããŒãã¡ã³ãã䜿çšããŠãäºåŸæ¡ä»¶ãæ€èšŒã§ããŸãã ããšãã°ã次ã®ãããªãã¯ã¡ãœããã¯ã¹ããŒãã¡ã³ãã䜿çšããŠäºåŸæ¡ä»¶ããã¹ãããŸãã
å€ïŒthis
-1 mod mïŒãæã€BigIntegerãè¿ããŸãã
public BigInteger modInverse(BigInteger m) { if (m.signum <= 0) { throw new ArithmeticException("Modulus not positive: " + m); } ...
翻蚳è
ã³ã¡ã³ã代æ°ã®ãããïŒåºæ°NïŒZ N ïŒã®å°äœã®ç°ã§ã¯ãxãNãšäºãã«çŽ ã§ããå Žåããã¹ãŠã®éãŒãèŠçŽ xã¯ïŒããã³äžæã®èŠçŽ ãæã€ïŒéèŠçŽ ãæã¡ãŸãã
äŸïŒ1ïŒãªã³ã°Z 5ã®éïŒïŒ
1ã®å Žå-é= 1ã1 * 1 mod 5 = 1
2ã®å Žå-é= 3ã2 * 3 mod 5 = 1
3ã®å Žå-é= 2ã3 * 2 mod 5 = 1
4ã®å Žå-é= 4ã4 * 4 mod 5 = 1
äŸïŒ2ïŒãªã³ã°Z 6ã®éïŒïŒ
1ã®å Žå-é= 1ã1 * 1 mod 6 = 1
2-è¿åäžå¯
3-è¿åäžå¯
4-è¿åäžå¯
5ã®å Žå-é= 5ã5 * 5 mod 6 = 1
232.xäºåŸæ¡ä»¶ãã§ãã¯ã«é¢é£ããèšç®ãå®è¡ããåã«ãããã€ãã®ããŒã¿ãä¿åããå¿
èŠãããå ŽåããããŸãã ãããè¡ãã«ã¯ã2ã€ã®ã¹ããŒãã¡ã³ããšã1ã€ä»¥äžã®å€æ°ã®ç¶æ
ãä¿åããåçŽãªå
éšã¯ã©ã¹ã䜿çšããŠãèšç®åŸã«ãã§ãã¯ïŒãŸãã¯åãã§ãã¯ïŒã§ããããã«ããŸãã ããšãã°ã次ã®ãããªã³ãŒãããããšããŸãã
void foo(int[] array) {
äžèšã®ã¡ãœããã倿ŽããŠãäºåŸæ¡ä»¶ã®ããã¹ãã¹ããŒãã¡ã³ãããæ©èœçãã«å€ããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã void foo(final int[] array) { // (inner) class DataCopy { private int[] arrayCopy; DataCopy() { arrayCopy = (int[]) array.clone();} boolean isConsistent() {return Arrays.equals(array, arrayCopy);} } DataCopy copy = null; // ; assert ((copy = new DataCopy()) != null); ... // array // , array assert copy.isConsistent(); }
ãã®ã¢ãããŒããç°¡åã«äžè¬åããŠãè€æ°ã®ããŒã¿é
ç®ãä¿åããä»»æã®è€éãã®ã¹ããŒãã¡ã³ãããã¹ãã§ããŸããæåã®ã¹ããŒãã¡ã³ãïŒå¯äœçšã®ã¿ãç®çãšããŠå®è¡ãããïŒãããã衚çŸåè±ããªæ¬¡ã®ã¹ããŒãã¡ã³ãã«çœ®ãæããããšãã§ããŸãã copy = new DataCopy();
ãããããªãã§ãã ããã2çªç®ã®äŸã¯ãã¹ããŒãã¡ã³ããå«ãŸããŠãããã©ããã«é¢ä¿ãªãé
åãã³ããŒããŸããããã¯ãã¯ã¬ãŒã ãç¡å¹ã«ãããå Žåã§ããã³ã¹ããçºçããªããšããååã«éåããŠããŸããã¯ã©ã¹äžå€é
ã¯ã©ã¹äžå€åŒã¯ãã¯ã©ã¹ã®åã€ã³ã¹ã¿ã³ã¹ã«åžžã«æ ŒçŽãããå
éšäžå€åŒã®äžçš®ã§ãããã ããäžè²«æ§ã®ããç¶æ
ããå¥ã®ç¶æ
ãžã®é·ç§»ã®ç¬éã¯äŸå€ã§ããã¯ã©ã¹äžå€åŒã¯ãç°ãªã屿§éã®é¢ä¿ã瀺ãããšãã§ããã¡ãœããã®å®äºååŸã«çã§ãªããã°ãªããŸãããããçš®ã®ããŒã¿ã®ãã©ã³ã¹ã®åããããªãŒæ§é ãå®è£
ãããšããŸããã¯ã©ã¹äžå€åŒã¯æ¬¡ã®ããã«ãªããŸããããªãŒã¯ãã©ã³ã¹ãåããŠãããé©åã«é åºä»ããããŠããŸããã¢ãµãŒã·ã§ã³ã¡ã«ããºã ã¯ãäžå€æ¡ä»¶ããã§ãã¯ããããã®ç¹å®ã®ã¹ã¿ã€ã«ã匷å¶ããŸããããã ããå¿
èŠãªå¶çŽããã§ãã¯ããåŒãçµã¿åãããŠãã¹ããŒãã¡ã³ããããªã¬ãŒã§ããåäžã®å
éšã¡ãœããã«ãããšäŸ¿å©ãªå ŽåããããŸãããã©ã³ã¹ã®åããããªãŒã®äŸãç¶ããã«ã¯ãããŒã¿æ§é ã®èŠä»¶ã«åŸã£ãŠããªãŒãæ¬åœã«ãã©ã³ã¹ãåããŠããããšã確èªãããã©ã€ããŒãã¡ãœãããå®è£
ããããšããå§ãããŸãã
ãã®ã¡ãœããã¯ãã¡ãœããã®å®è¡ååŸã«trueã§ãªããã°ãªããªãå¶çŽããã§ãã¯ãããããåãããªãã¯ã¡ãœãããšã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãæ»ãã®çŽåã«æ¬¡ã®è¡ãå«ãå¿
èŠããããŸãã assert balanced();
ååãšããŠãããŒã¿æ§é ããã€ãã£ãã¡ãœããã«ãã£ãŠå®è£
ãããŠããªãå Žåã«ã®ã¿ãåãããªãã¯ã¡ãœããã®ããããŒã«åæ§ã®ãã§ãã¯ãé
眮ããå¿
èŠã¯ãããŸããããã®å Žåãã¡ã¢ãªç Žæã®ãã°ã«ãããã¡ãœããåŒã³åºãéã§JavaãããŒããïŒããã€ãã£ããã¢ãïŒã®ãã¬ãŒã ã¯ãŒã¯å€ã®ããŒã¿æ§é ãç Žæããå¯èœæ§ããããŸããã¡ãœããã®éå§æã®ãšã©ãŒã¯ããã®çš®ã®ã¡ã¢ãªç Žæãçºçããããšã瀺ããŸãããŸããã¯ã©ã¹ã®ç¶æ
ãä»ã®ã¯ã©ã¹ã«ãã£ãŠå€æŽãããå¯èœæ§ãããå Žåãåã¯ã©ã¹ã¡ãœããã®å
é ã«ã¯ã©ã¹äžå€æ¡ä»¶ã®ãã§ãã¯ãå«ããããšãé©åã§ããç¶æ
ãä»ã®ã¯ã©ã¹ããçŽæ¥èŠããªãããã«ãã¯ã©ã¹ãã¶ã€ã³ã䜿çšããããšããå§ãããŸãã翻蚳è
ã³ã¡ã³ã« » ( ) « » . . «» , «» - , .
é«åºŠãªãã¯ããã¯
次ã®ã»ã¯ã·ã§ã³ã§ã¯ããªãœãŒã¹ãšã·ã¹ãã ãå¶éãããŠããããã€ã¹ã«ã®ã¿é©çšããããããã¯ã«ã€ããŠèª¬æããŸãããããã®ããã€ã¹ã§ã¯ãã¯ã¬ãŒã ãç¡å¹ã«ããªãã§ãã ããããã®ãããã¯ã«èå³ããªãå Žåã¯ã次ã®ã»ã¯ã·ã§ã³ãã¯ã¬ãŒã ã䜿çšãããã¡ã€ã«ã®ã³ã³ãã€ã«ãã«é²ãã§ãã ãããã¯ã©ã¹ãã¡ã€ã«ããã¯ã¬ãŒã ãåé€ãã
ãªãœãŒã¹ãéãããŠããããã€ã¹çšã®ã¢ããªã±ãŒã·ã§ã³ãéçºããããã°ã©ããŒã¯ãã¯ã©ã¹ãã¡ã€ã«ããã¯ã¬ãŒã ãå®å
šã«åé€ãããå ŽåããããŸããããã«ãããååçã«ã¹ããŒãã¡ã³ããã¢ã¯ãã£ãã«ããããšã¯ã§ããŸããããã¯ã©ã¹ãã¡ã€ã«ã®ãµã€ãºãå°ãããªããã¯ã©ã¹ã®èªã¿èŸŒã¿ãéããªããŸããé«å質ã®JITã³ã³ãã€ã©ããªãå Žåãããã«ããã¡ã¢ãªèŠä»¶ãäœããªããå®è¡æã®ããã©ãŒãã³ã¹ãåäžããŸããã¯ã¬ãŒã ã¡ã«ããºã ã¯ãã¯ã©ã¹ãã¡ã€ã«ããããããåé€ããããã®çŽæ¥çãªãµããŒããæäŸããŸããããã ããã¹ããŒãã¡ã³ãã¯ãæ¡ä»¶ä»ãã³ã³ãã€ã«ãã®ã€ãã£ãªã ãšçµã¿åãããŠäœ¿çšââã§ããŸãããã®ã¢ãããŒãã¯Java仿§ã§èª¬æãããŠãããçæãããã¯ã©ã¹ãã¡ã€ã«å
ã®ã¹ããŒãã¡ã³ããžã®ãã¹ãŠã®ãåç
§ããã³ã³ãã€ã©ãŒãæé€ã§ããããã«ããŸãã static final boolean asserts = ... ;
翻蚳è
ã³ã¡ã³ã« » .
:
«An optimizing compiler may realize that the statement⊠will never be executed and may choose to omit the code for that statement from the generated class file ...»
( , ) javac «optimizing compiler»,
public class App { static final boolean asserts = false; public static void main(String[] args) {
public class App { static final boolean asserts = false; public static void main(String[] args) {
ã¯ã¬ãŒã ãè«æ±ããæ¹æ³
äžéšã®éèŠãªã·ã¹ãã ã®ããã°ã©ããŒã¯ãå«ãŸããã¹ããŒãã¡ã³ãã®ã¿ã§ã³ãŒããåäœããããå ŽåããããŸããæ¬¡ã®éçããŒã¹ã®ã¢ãããŒãã¯ãã¹ããŒãã¡ã³ããç¡å¹ã«ãªã£ãŠããå Žåãã¯ã©ã¹ã®åæåãé²ããŸãã static { boolean assertsEnabled = false; assert assertsEnabled = true; // !!! if (!assertsEnabled) throw new RuntimeException(" !!!"); }
ãã®éçåæååãã¯ã©ã¹å®£èšã®å
é ã«çœ®ããŸãã翻蚳è
ã³ã¡ã³ã« » , â . ã€ãŸã
class App { static int x = f(); static { System.err.println("static{}"); } static int y = g(); static { boolean assertsEnabled = false; assert assertsEnabled = true; if (!assertsEnabled) throw new RuntimeException(); } public static void main(String[] args) {} static int f() { System.err.println("f()"); return 0; } static int g() { System.err.println("g()"); return 0; } } >> f() >> static{} >> g() >> Exception in thread "main" java.lang.ExceptionInInitializerError >> ...
.
ã¯ã¬ãŒã ã䜿çšãããã¡ã€ã«ã®ã³ã³ãã€ã«
javacã³ã³ãã€ã©ãã¹ããŒãã¡ã³ããå«ãã³ãŒããåãå
¥ããã«ã¯ã次ã®äŸã®ããã«-source 1.4ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ã䜿çšããå¿
èŠããããŸãã javac -source 1.4 MyClass.java
ãã®ãã©ã°ã¯ããœãŒã¹ã³ãŒãã¬ãã«ã§äºææ§ã®åé¡ãåŒãèµ·ãããªãããã«å¿
èŠã§ãã翻蚳è
ã³ã¡ã³ãjavac (-source -target)javac -source 1.3 -target 1.4class-. , . ã€ãŸã , Java 5 Java 1.3, - Java 1.4.
1.3 , , assert , generics, varargs,âŠ
class- 1.4 , , class- Java 1.4.
class- (minor_version, major_version)
ClassFile { ... u2 minor_version; u2 major_version; ... }
Oracle's Java Virtual Machine implementation in JDK release 1.0.2 supports class file format versions 45.0 through 45.3 inclusive. JDK releases 1.1.* support class file format versions in the range 45.0 through 45.65535 inclusive. For k ⥠2, JDK release 1.k supports class file format versions in the range 45.0 through 44+k.0 inclusive.
ã¯ã¬ãŒã ã®æå¹åãšç¡å¹å
æ¢å®ã§ã¯ãèŠæ±ã¯å®è¡æã«ç¡å¹ã«ãªããŸãã2ã€ã®ã³ãã³ãã©ã€ã³ã¹ã€ããããããŸããããŸããŸãªè©³çްã¬ãã«ã§ã¹ããŒãã¡ã³ããæå¹ã«ããã«ã¯ã-enableassertionsãŸãã¯-eaã䜿çšããŸããããŸããŸãªè©³çްã¬ãã«ã§ã¹ããŒãã¡ã³ããç¡å¹ã«ããã«ã¯ã-disableassertionsãŸãã¯-daã䜿çšããŸãããã©ã°åŒæ°ã§ç²åºŠãæå®ããŸãïŒ- åŒæ°ã®æ¬ èœ
ã·ã¹ãã ã¯ã©ã¹ãé€ããã¹ãŠã®ã¯ã©ã¹ã§ã¹ããŒãã¡ã³ãããªã³ãŸãã¯ãªãã«ããŸã - packageName ...
æå®ããããã±ãŒãžããã³ãã¹ãŠã®ãµãããã±ãŒãžå
ã®ã¹ããŒãã¡ã³ããæå¹ãŸãã¯ç¡å¹ã«ããŸã - ...
çŸåšã®äœæ¥ãã£ã¬ã¯ããªã«ããååã®ãªãããã±ãŒãžã®ã¹ããŒãã¡ã³ããæå¹ãŸãã¯ç¡å¹ã«ããŸãã - className
æå®ãããã¯ã©ã¹ã®ã¹ããŒãã¡ã³ããæå¹ãŸãã¯ç¡å¹ã«ããŸãã
ããšãã°ã次ã®ã³ãã³ãã¯ãcom.wombat.fruitbatããã±ãŒãžãšãã®ãµãããã±ãŒãžã«å¯ŸããŠã®ã¿æå¹ã«ãªã£ãŠããã¯ã¬ãŒã ã䜿çšããŠãBatTutorããã°ã©ã ãèµ·åããŸãã java -ea:com.wombat.fruitbat... BatTutor
ã³ãã³ãã©ã€ã³ã«ãã®ãããªãã¹ã€ããããããã€ãå«ãŸããŠããå Žåãã¯ã©ã¹ãããŒãããåã«é çªã«åŠçãããŸããããšãã°ã次ã®ã³ãã³ãã¯ãcom.wombat.fruitbatããã±ãŒãžã¯ã¬ãŒã ãæå¹ã«ããŠcom.wombat.fruitbat.Brickbatã¯ã©ã¹ãç¡å¹ã«ããŠBatTutorããã°ã©ã ãèµ·åããŸãã java -ea:com.wombat.fruitbat... -da:com.wombat.fruitbat.Brickbat BatTutor
äžèšã®ã³ãã³ãã©ã€ã³ãã©ã°ã¯ã1ã€ã®äŸå€ãé€ããŠãã¹ãŠã®ã¯ã©ã¹ããŒããŒã«é©çšãããŸããããã¯ã·ã¹ãã ClassLoaderã§ããäŸå€ã¯ãåŒæ°ãªãã®ã¹ã€ããã«é¢ãããã®ã§ãïŒäžèšã®ããã«ïŒã·ã¹ãã ã¯ã©ã¹ã«ã¯é©çšãããŸããããã®åäœã«ãããéåžžæãŸããã·ã¹ãã ã¯ã©ã¹ãé€ããã¹ãŠã®ã¯ã©ã¹ã«æ¿èªãç°¡åã«å«ããããšãã§ããŸãããã¹ãŠã®ã·ã¹ãã ã¯ã©ã¹ã§ã¹ããŒãã¡ã³ããæå¹ã«ããã«ã¯ãå¥ã®ãã©ã°-enablesystemassertionsãŸãã¯-esaã䜿çšããŸããåæ§ã«ãã·ã¹ãã ã¯ã©ã¹ã®ã¹ããŒãã¡ã³ããç¡å¹ã«ããã«ã¯ã-disablesystemassertionsãŸãã¯-dsaã䜿çšããŸããããšãã°ã次ã®ã³ãã³ãã¯ãã·ã¹ãã ã¯ã©ã¹ãšcom.wombat.fruitbatããã±ãŒãžãšãã®ãµãããã±ãŒãžã®äž¡æ¹ã«ã¯ã¬ãŒã ãå«ãŸããBatTutorããã°ã©ã ãèµ·åããŸãã java -esa -ea:com.wombat.fruitbat...
ã¯ã©ã¹ã®æ¿èªã¹ããŒã¿ã¹ïŒãªã³ãŸãã¯ãªãïŒã¯ãã¯ã©ã¹ãåæåããããšãã«èšå®ããã倿ŽãããªããªããŸãããã ããç¹å¥ãªåŠçãå¿
èŠãªå¥ã®ã±ãŒã¹ããããŸããéåžžã¯æãŸãããããŸããããåæåã®åã«ã¡ãœãããŸãã¯ã³ã³ã¹ãã©ã¯ã¿ãŒãå®è¡ããããšã¯å¯èœã§ããããã¯ãéçåæåæé ã§ã¯ã©ã¹éå±€ã埪ç°ããŠããå Žåã«çºçããå¯èœæ§ããããŸããã¯ã©ã¹ãåæåãããåã«æãå®è¡ãããå Žåãå®è¡ã¯æãã¯ã©ã¹ã«å«ãŸããŠãããã®ããã«åäœããå¿
èŠããããŸãããã®ãããã¯ã¯ãJava仿§ã§è©³ãã説æãããŠããŸãã翻蚳è
ã³ã¡ã³ã:
An assert statement that is executed before its class has completed initialization is enabled.
This rule is motivated by a case that demands special treatment. Recall that the assertion status of a class is set no later than the time it is initialized. It is possible, though generally not desirable, to execute methods or constructors prior to initialization. This can happen when a class hierarchy contains a circularity in its static initialization, as in the following example:
public class Foo { public static void main(String[] args) { Baz.testAsserts(); // Will execute after Baz is initialized. } } class Bar { static { Baz.testAsserts(); // Will execute before Baz is initialized! } } class Baz extends Bar { static void testAsserts() { boolean enabled = false; assert enabled = true; System.out.println("Asserts " + (enabled ? "enabled" : "disabled")); } } >> Asserts enabled >> Asserts disabled
Invoking Baz.testAsserts() causes Baz to be initialized. Before this can happen, Bar must be initialized. Bar's static initializer again invokes Baz.testAsserts(). Because initialization of Baz is already in progress by the current thread, the second invocation executes immediately, though Baz is not initialized (§12.4.2).
Because of the rule above, if the program above is executed without enabling assertions.
æ¢åã®ããã°ã©ã ãšã®äºææ§
Javaã§assertããŒã¯ãŒãã远å ããŠããæ¢åã®ãã€ããªïŒ.classãã¡ã€ã«ïŒã§åé¡ã¯çºçããŸãããassertãèå¥åãšããŠäœ¿çšããã¢ããªã±ãŒã·ã§ã³ãã³ã³ãã€ã«ããããšãããšãã³ã³ãã€ã©ã®èŠåãŸãã¯ãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããŸããã¹ããŒãã¡ã³ããæå¹ãªèå¥åã§ããäžçããããã§ãªãäžçãžã®ç§»è¡ã容æã«ããããã«ãã³ã³ãã€ã©ã¯ãã®ããŒãžã§ã³ã§2ã€ã®åäœã¢ãŒãããµããŒãããŠããŸãã- ãœãŒã¹ã¢ãŒã1.3ïŒããã©ã«ãïŒ-ã³ã³ãã€ã©ã¯ã¢ãµãŒããèå¥åãšããŠäœ¿çšããããã°ã©ã ãåãå
¥ããŸãããèŠåãçºè¡ããŸãããã®ã¢ãŒãã§ã¯ãããã°ã©ã ã¯ã¹ããŒãã¡ã³ãã䜿çšã§ããŸããã
- ãœãŒã¹ã¢ãŒã1.4-ããã°ã©ã ãã¢ãµãŒããèå¥åãšããŠäœ¿çšãããšãã³ã³ãã€ã©ã¯ãšã©ãŒã¡ãã»ãŒãžãçæããŸãããã®ã¢ãŒãã§ã¯ãããã°ã©ã ã¯æ¿èªã䜿çšã§ããŸãã
-source 1.4ãã©ã°ãæå®ããŠãœãŒã¹ã¢ãŒã1.4ãç¹ã«èŠæ±ããªãéããã³ã³ãã€ã©ã¯ãœãŒã¹ã¢ãŒã1.3ã§åäœããŸãããã®ãã©ã°ã®äœ¿çšãå¿ãããšãã¹ããŒãã¡ã³ãã䜿çšããããã°ã©ã ã¯ã³ã³ãã€ã«ãããŸãããã³ã³ãã€ã©ãŒã«ããã©ã«ãã®åäœãšããŠå€ãã»ãã³ãã£ã¯ã¹ã䜿çšããããšã匷å¶ããæ±ºå®ïŒã€ãŸããassertãèå¥åãšããŠäœ¿çšã§ããããã«ããïŒã¯ãæã奜ãŸããäºæã¢ãŒãã®ããã«è¡ãããŸããããœãŒã¹ã¢ãŒã1.3ã¯é·ãéæ©èœããå¯èœæ§ããããŸãã翻蚳è
ã³ã¡ã³ã( Java 1.4), . ã€ãŸã javac JDK 7 JDK 8 , -source 1.3
èšèšãšFAQ
ãã®ã»ã¯ã·ã§ã³ã«ã¯ãã¢ãµãŒãã®å
éšæ§é ã«é¢ãããããã質åãå«ãŸããŠããŸããäžè¬çãªåé¡äºææ§ã®æ§æãšã»ãã³ãã£ã¯ã¹ã¯ã©ã¹AssertionErrorã¯ã¬ãŒã ã®æå¹åãšç¡å¹åäžè¬çãªè³ªå
ç¹å¥ãªãµããŒããªãã§Javaããã°ã©ãã³ã°èšèªã®äžã«ã¢ãµãŒã·ã§ã³ãããã°ã©ã ã§ããã®ã«ããªãã¢ãµãŒãã£ãæ§ãæäŸããã®ã§ããïŒç¹å¥ãªå®è£
ã¯å¯èœã§ãããå€ãã®å ŽåãtheyãïŒåã¹ããŒãã¡ã³ãã«ifãå¿
èŠïŒãŸãã¯éå¹ççã§ãïŒã¹ããŒãã¡ã³ããç¡å¹ã«ãªã£ãŠããŠãæ¡ä»¶ãèšç®ããŸãïŒãããã«ãããããã®ç¹å¥ãªå®è£
ã¯ãç¬èªã®æ¹æ³ã§ã¹ããŒãã¡ã³ãã®å
å«ãšéã¢ã¯ãã£ãåãå®è£
ããŸããããã«ãããç¹ã«ãããã°ã¢ãŒãã§ãããã®å®è£
ã®æçšæ§ãäœäžããŸãããããã®æ¬ é¥ã®çµæãšããŠãã¯ã¬ãŒã ã¯Javaããã°ã©ããŒã®æåã®äžéšã§ã¯ãããŸããã§ããããã©ãããã©ãŒã ã«ã¯ã¬ãŒã ã®ãµããŒãã远å ãããšããã®ç¶æ³ãä¿®æ£ã§ããå¯èœæ§ãé«ããªããŸãããªããã®ããŒã«ã®å°å
¥ã¯ãã©ã€ãã©ãªã®åœ¢ã§ã¯ãªããèšèªã®æ¡åŒµã«ãã£ãŠè¡ãããã®ã§ããïŒèšèªã®å€æŽã¯é倧ãªã¹ãããã§ããã軜èŠãã¹ãã§ã¯ãªãããšãèªèããŠããŸããã©ã€ãã©ãªãä»ããã¢ãããŒããæ€èšãããŸããããã ããã¹ããŒãã¡ã³ãããªãã«ãªã£ãŠããå Žåã¯ãã¹ããŒãã¡ã³ãã®å®è¡ã³ã¹ããç¡èŠã§ããããšãéèŠã§ãããšèããããŠããŸããã©ã€ãã©ãªã®å Žåããããå®çŸããããã«ãããã°ã©ããŒã¯åã¹ããŒãã¡ã³ããifã¹ããŒãã¡ã³ããšããŠããŒãã³ãŒãã£ã³ã°ããå¿
èŠããããŸããå€ãã®ããã°ã©ããŒã¯ãããããŸãããifã¹ããŒãã¡ã³ããçç¥ããããã©ãŒãã³ã¹ãäœäžããããã¹ããŒãã¡ã³ããå®å
šã«ç¡èŠããŸãããŸããã¹ããŒãã¡ã³ãã¯James Goslingã®å
ã®Java仿§ã«å«ãŸããŠããããšã«ã泚æããŠãã ãããç³ãç«ãŠã¯ãæºè¶³ã®ããéçºãšå®è£
ã®æéããªããããOak仿§ããåé€ãããŸããã翻蚳è
ã³ã¡ã³ãJava Oak . :).
-- (design-by-contract) , , Eiffel?ãã®å¯èœæ§ãæ€èšããŸãããããã©ãããã©ãŒã ã©ã€ãã©ãªã®å€§å¹
ãªå€æŽããå€ãã©ã€ãã©ãªãšæ°ããã©ã€ãã©ãªéã®åŸæ¹äºææ§ã®å€§ããªéåãªãã«ãJavaã«ãç§»æ€ãããããšã¯ã§ããŸãããããã«ããã®ãããªæ©äŒããJavaã®ç¹åŸŽã§ããèšèªã®ã·ã³ãã«ããç¶æã§ãããã©ãããããããŸããã§ããããã®çµæãåçŽãªæ¡ä»¶ä»ãã¹ããŒãã¡ã³ãïŒããŒã«åã®ã¢ãµãŒã·ã§ã³æ©èœïŒãããªãçè§£å¯èœãªãœãªã¥ãŒã·ã§ã³ã§ããããªã¹ã¯ãã¯ããã«å°ãªããšããçµè«ã«éããŸãããæ¡ä»¶æãèšèªã«è¿œå ããŠããå°æ¥ã®èšèšããšã®å®å
šãªãµããŒãã®è¿œå ã劚ããããããšã¯ãããŸãããã·ã³ãã«ãªã¹ããŒãã¡ã³ãã«ãããå¥çŽã«ããèšèšã®éããã圢åŒãå®éã«äœ¿çšã§ããŸãããã®ã¢ãµãŒãã¯ãå
éšïŒéãããªãã¯ïŒäºåæ¡ä»¶ãäºåŸæ¡ä»¶ãããã³ã¯ã©ã¹äžå€æ¡ä»¶ã®ãã§ãã¯ã«é©ããŠããŸããå€éšïŒãããªãã¯ïŒäºåæ¡ä»¶ãã§ãã¯ã¯ãã¡ãœããå
ã®ãã§ãã¯ã«ãã£ãŠå®è¡ããããšãã§ããŸããããã«ãããç¹ã«ãIllegalArgumentExceptionãIllegalStateExceptionãªã©ã®ææžåãããäŸå€ãçºçããŸããããŒã«ã¢ãµãŒã·ã§ã³ã«å ããŠãã¢ãµãŒã·ã§ã³ãç¡å¹ã«ãªã£ãŠããå Žåã«ã³ãŒããããã¯ã®å®è¡ãç¡å¹ã«ããããã®ã¢ãµãŒã·ã§ã³ã®ãããªæ§é ãæäŸããŠã¿ãŸãããïŒãã®ãããªèšèšãæäŸãããšãããã°ã©ããŒã¯è€éãªã€ã³ã©ã€ã³ã¹ããŒãã¡ã³ããäœæããããã«ãªããŸãããããããå¥ã
ã®ã¡ãœããã«å
¥ããæ¹ãé©åã§ããäºææ§
æ°ããããŒã¯ãŒãã¯ãèå¥åãšããŠãã¢ãµãŒããã䜿çšããæ¢åã®ããã°ã©ã ãšã®äºææ§ã®åé¡ã«ãªããŸããïŒã¯ãããœãŒã¹ãã¡ã€ã«ã¬ãã«ã§ïŒèå¥åãšã㊠'assert'ã䜿çšããã¯ã©ã¹ã®ãã€ããªã¯åŒãç¶ãæ£åžžã«åäœããŸããïŒç§»è¡ã容æã«ããããã«ãéçºè
ãç§»è¡æéäžã«èå¥åãšã㊠'assert'ã䜿çšãç¶ããããšãã§ããæŠç¥ãå®è£
ããŸããããã®ããŒã«ã¯ãå€ãJREã§ã¯å®è¡ã§ããªãã¯ã©ã¹ãã¡ã€ã«ãçæããŸãããïŒã¯ããããã§ããã¯ã©ã¹ãã¡ã€ã«ã¯ãã¡ãœããã®æ°ããã¯ã©ã¹ã®èª²é¡ã«å«ãŸããŠããŸãã¯ã©ã¹ããŒãããã³ã¯ã©ã¹ãªã©ïŒïŒdesiredAssertionStatusãããããã®ã¡ãœããã®åŒã³åºããå«ãã¯ã©ã¹ãã¡ã€ã«ãå€ãJREïŒã¯ã©ã¹ClassLoaderã«ãã®ãããªã¡ãœããããªãïŒã«ãã£ãŠå®è¡ãããå Žåãããã°ã©ã ã¯å®è¡ããããNoSuchMethodErrorãã¹ããŒããŸããããã¯ãèšèªã®æ°ããæ©èœã䜿çšããããã°ã©ã ãå€ãããŒãžã§ã³ãšäºææ§ããªãå Žåã«åœãŠã¯ãŸããŸããæ§æãšã»ãã³ãã£ã¯ã¹
Expression 2ã§ããªããã£ãåãèš±å¯ãããã®ã¯ãªãã§ããïŒãã®åŒã®ã¿ã€ããå¶éããæ£åœãªçç±ã¯ãããŸãããä»»æã®åã®è§£æ±ºã¯ãããšãã°ãäžæã®æŽæ°ã³ãŒããåã¹ããŒãã¡ã³ãã«é¢é£ä»ãããéçºè
ã«äŸ¿å©ã§ããããã«ãSystem.out.printlnïŒ...ïŒã®åŒæ°ãšããŠåŒããæãããããã«ããŸããããã¯æãŸãããšæãããŸããã¯ã©ã¹AssertionError
åŒ2ãæ¬ èœããŠããã¹ããŒãã¡ã³ãã«ãã£ãŠAssertionErrorãçæãããå Žåãããã°ã©ã ãã¹ããŒãã¡ã³ãã®ç¶æ
ã詳现ãªããã¹ãã¡ãã»ãŒãžïŒããšãã°ããé«ã<æå€§é«ããïŒã§å ±åããªãã®ã¯ãªãã§ããïŒããã«äœ¿ããæçšæ§ãåäžããå ŽåããããŸãããããã¯ããããã¹ãŠã®æåå宿°ãã¯ã©ã¹ãã¡ã€ã«ã«è¿œå ããŠã©ã³ã¿ã€ã ã€ã¡ãŒãžã衚ãã³ã¹ããæ£åœåãããã®ã§ã¯ãããŸãããAssertionErrorããã®äŸå€ãã¹ããŒãããªããžã§ã¯ããžã®ã¢ã¯ã»ã¹ãæäŸããªãã®ã¯ãªãã§ããïŒåæ§ã«ãã¹ããŒãã¡ã³ãããAssertionErrorã³ã³ã¹ãã©ã¯ã¿ãŒã«ä»»æã®ãªããžã§ã¯ããæž¡ããªãã®ã¯ãªãã§ãããšã©ãŒã¡ãã»ãŒãžïŒæååïŒã®ä»£ããã«ïŒãããã®ãªããžã§ã¯ããžã®ã¢ã¯ã»ã¹ã«ãããããã°ã©ããŒã¯ã¹ããŒãã¡ã³ãã®å€±æåŸã«ã·ã¹ãã ã埩å
ããããšããŸãããããã¯ãã®èšèªæ©èœã®ç®çãšççŸããŸããAssertionErrorã«ã³ã³ããã¹ãã¢ã¯ã»ã¹ã¡ãœããïŒgetFileïŒïŒãgetLineïŒïŒãgetMethodïŒïŒãªã©ïŒãæäŸããªãã®ã¯ãªãã§ããïŒãã®æ©èœã¯Throwableã«ãã§ã«æäŸãããŠããŸãããããã£ãŠãã¢ãµãŒã·ã§ã³ãšã©ãŒã ãã§ãªãããã¹ãŠã®ã¹ããŒå¯èœãªããžã§ã¯ãã«äœ¿çšã§ããŸããThrowable.getStackTraceïŒïŒã«ã¯ãã®æ©èœãæäŸããã¡ãœããããããŸãã翻蚳è
ã³ã¡ã³ã public class App { public static void main(String[] args) { try { f(); } catch (Throwable t) { StackTraceElement[] stack = t.getStackTrace(); StackTraceElement frame = stack[0]; System.out.println("FileName: " + frame.getFileName()); System.out.println("ClassName: " + frame.getClassName()); System.out.println("MethodName: " + frame.getMethodName()); System.out.println("LineNumber: " + frame.getLineNumber()); } } public static void f() { throw new RuntimeException(); } } >> FileName: App.java >> ClassName: App >> MethodName: f >> LineNumber: 16
AssertionError Error , RuntimeException ?ããã¯è«ç¹ã§ãã
å°éå®¶ã°ã«ãŒããããã«ã€ããŠè°è«ããAssertionErrorã®åŸã«ããã°ã©ããŒãããã°ã©ã ã埩å
ããããšããã®ãé²ãããã«ãErrorãããé©åãªç¥å
ã§ãããšããçµè«ã«éããŸãããäžè¬çã«ãã¢ãµãŒããšã©ãŒã®åå ãç¹å®ããããšã¯ããªãå°é£ã§ãããäžå¯èœã§ãããã®ãããªæåŠã¯ãããã°ã©ã ããæªç¥ã®æ¹åã«ç§»åããŠãããããšïŒãæ¢ç¥ã®é åã®å€ãïŒãæå³ããå®è¡ãç¶ç¶ããããšãããšèŽåœçãšãªãå¯èœæ§ããããŸããããã«ãèŠåã®èŠåã§ã¯ãã»ãšãã©ã®å®è¡æäŸå€ïŒäŸå€ã§ã¯ãªãããšã©ãŒã§ã¯ãªãç¶æ¿ïŒã瀺ãã¡ãœãããå¿
èŠã§ãïŒ@throwsjavadocïŒãã¡ãœããã®ä»æ§ã«ã¢ãµãŒããšã©ãŒãçæã§ããç¶æ³ãå«ããããšã¯ã»ãšãã©æå³ããããŸããããã®ãããªæ
å ±ã¯å®è£
ã®è©³çްãšèŠãªãããšãã§ããå®è£
ããšã«ããŸããªãªãŒã¹ããšã«ç°ãªãå ŽåããããŸããã¯ã¬ãŒã ã®æå¹åãšç¡å¹å
ã¹ããŒãã¡ã³ãããªã³ãŸãã¯ãªãã«ããããŒã ããåŸæ¥ã®ããã±ãŒãžã»ãã³ãã£ã¯ã¹ã®ä»£ããã«ããã±ãŒãžããªãŒã»ãã³ãã£ã¯ã¹ã䜿çšããã®ã¯ãªãã§ããïŒããã°ã©ããŒã¯å®éã«ããã±ãŒãžãéå±€æ§é ãšããŠäœ¿çšããŠã³ãŒããç·šæãããããéå±€å¶åŸ¡ã¯äŸ¿å©ã§ããããšãã°ãpackage-as-treesã®ã»ãã³ãã£ã¯ã¹ã«ããã1ã€ã®ã¢ã¯ã·ã§ã³ã®ãã¹ãŠã®Swingã§ã¹ããŒãã¡ã³ããæå¹ãŸãã¯ç¡å¹ã«ã§ããŸãã翻蚳è
ã³ã¡ã³ãJava, ( ).
: .
ã€ãŸã
aaa.bbb.ccc «»
aaa.bbb xxx.yyy.zzz . (public, protected, (package private), private) : . « ».
Swing
javax.swing.* javax.swing.border.* javax.swing.colorchooser.* javax.swing.event.* javax.swing.filechooser.* javax.swing.plaf.* javax.swing.plaf.basic.* javax.swing.plaf.metal.* javax.swing.plaf.multi.* javax.swing.plaf.nimbus.* javax.swing.plaf.synth.* javax.swing.table.* javax.swing.text.* javax.swing.text.html.* javax.swing.text.html.parser.* javax.swing.text.rtf.* javax.swing.tree.* javax.swing.undo.* javax.swing.* javax.swing.*
--
javax.swing.* .
setClassAssertionStatusïŒïŒãæ¿èªã¹ããŒã¿ã¹ãèšå®ããã®ã«é
ãããå ŽåïŒã€ãŸããã¯ã©ã¹ãæ¢ã«åæåãããŠããå ŽåïŒãäŸå€ãã¹ããŒãã代ããã«ããŒã«å€ãè¿ãã®ã¯ãªãã§ããïŒãã©ã°ã®èšå®ãé
ãããå ŽåãèŠåã¡ãã»ãŒãžä»¥å€ã®ã¢ã¯ã·ã§ã³ã¯å¿
èŠãããŸãããäŸå€ã¯äžå¿
èŠã«éãããã§ããsetDefaultAssertionStatusïŒïŒãšsetAssertionStatusïŒïŒã®2ã€ã䜿çšãã代ããã«ã1ã€ã®ã¡ãœããåããªãŒããŒããŒãããªãã®ã¯ãªãã§ããïŒåœåæ¹æ³ã®æç¢ºãã¯ãäžè¬çãªå©çã®ããã§ããã¡ãœããã®ãªãŒããŒããŒãã¯æ··ä¹±ãåŒãèµ·ããåŸåããããŸããdesiredAssertionStatusã®ã»ãã³ãã£ã¯ã¹ãã«ã¹ã¿ãã€ãºããªãã®ã¯ãªãã§ããã¯ã©ã¹ããã§ã«åæåãããŠãããšãã«ã¹ããŒãã¡ã³ãã®çŸåšã®ç¶æ
ãè¿ãããšã§ããããããã°ã©ããŒãã¬ã³ããªãŒãã«ããããã«ïŒçµæãšããŠçããæ¹æ³ã«äœããã®å©ç¹ããããã©ããã¯ãŸã æç¢ºã§ã¯ãããŸããããã®ã¡ãœããã¯ãã¢ããªã±ãŒã·ã§ã³ããã°ã©ãã䜿çšããããã®ãã®ã§ã¯ãªããå¿
èŠä»¥äžã«é
ããŠé£ããããã®ã¯å®çšçã§ã¯ãªãããã§ããã¢ãã¬ãããã¹ããŒãã¡ã³ãããªã³/ãªãã«ã§ããªãããã«ããRuntimePermissionããªãã®ã¯ãªãã§ããïŒã¢ãã¬ãããClassLoaderã¡ãœãããåŒã³åºãçç±ã¯ãããŸãããã¹ããŒãã¡ã³ãã®å
å«/é€å€ã®ã¹ããŒã¿ã¹ã倿Žãããã®ãããªåŒã³åºããè¡ãããšã¯ç¡å®³ã«æããŸããææªã®ã·ããªãªã§ã¯ãã¢ãã¬ããã¯ãåæåãå¿
èŠãªã¯ã©ã¹ã«ã¹ããŒãã¡ã³ããå«ããããšã«ãããç°¡åãªãµãŒãã¹æåŠæ»æãåŒãèµ·ããå¯èœæ§ããããŸããããã«ãã¢ãã¬ããã¯ãã¢ãã¬ãããã¢ã¯ã»ã¹ã§ããã¯ã©ã¹ããŒããŒã«ãã£ãŠããŒããããå¿
èŠãããã¯ã©ã¹ã¹ããŒãã¡ã³ãã®ã¹ããŒã¿ã¹ã«ã®ã¿åœ±é¿ãäžããããšãã§ããŸãããŸããããã§ã¯ãä¿¡é Œã§ããªãã³ãŒãã®ã¯ã©ã¹ããŒããŒïŒgetClassLoaderïŒã«ã¢ã¯ã»ã¹ã§ããªãããã«ããRuntimePermissionãæ¢ã«ååšããŸãã翻蚳è
ã³ã¡ã³ã«» Java.
java.lang.SecurityManager ( â , â ) RuntimePermission , â .
// "" public class App { public static void main(String[] args) { while (true); } }
// - public class App { public static void main(String[] args) { new Thread(new Runnable() { public void run() { System.exit(123); } }).start(); while (true); } } >> Process finished with exit code 123
// System.exit(123); // ... ""! public class App { public static void main(String[] args) { System.setSecurityManager(new SecurityManager() { public void checkExit(int status) { throw new SecurityException("You haven't permission to exit."); } }); new Thread(new Runnable() { public void run() {System.exit(123);} }).start(); while (true); } }
/ ,
, .
public class App { public static void main(String[] args) { ClassLoader loader = App.class.getClassLoader(); loader.setDefaultAssertionStatus(true); loader.setPackageAssertionStatus("", true); } }
SecurityException
grant { permission java.lang.RuntimePermission "getClassLoader"; };
java.policy
ãåšå²ã®ãã¯ã©ã¹ã®æ¿èªç¶æ
ãç
§äŒããæ§æãæäŸããªãã®ã¯ãªãã§ããïŒãã®ãããªèšèšã«ããã人ã
ã¯è€éãªã¹ããŒãã¡ã³ãã³ãŒããäœæããããšãã§ããŸãããããŠãããã¯æªã決æã ãšèããŠããŸãããŸããå¿
èŠã«å¿ããŠãçŸåšã®APIã®äžã«æ¬¡ã®æ§æã䜿çšããŸãã boolean assertsEnabled = false; assert assertsEnabled = true;
ã¯ã©ã¹ã®åæåã®åã«å®è¡ãããã¢ãµãŒãããã¹ããŒãã¡ã³ããå«ãŸããŠãããã®ããã«åäœããã®ã¯ãªãã§ããïŒã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãšã¡ãœãããåæåãããåã«æ©èœã§ããããšãç¥ã£ãŠããããã°ã©ãã¯ã»ãšãã©ããŸããããããçºçããå Žåãã¯ã©ã¹äžå€åŒããŸã äœæãããŠããªãå¯èœæ§ãé«ããæ·±å»ã§åŸ®åŠãªãšã©ãŒã«ã€ãªããå¯èœæ§ããããŸãããã®ç¶æ
ã§å®è¡ãããã¹ããŒãã¡ã³ãã¯ããããåäœãããåé¡ã«ã€ããŠããã°ã©ããŒã«èŠåããŸãããããã£ãŠãããã°ã©ãããã®ãããªéæšæºçãªç¶æ³ã§ã³ãŒããééãããã¹ãŠã®ã¹ããŒãã¡ã³ããå®è¡ããããšã¯äžè¬ã«äŸ¿å©ã§ããé£çµ¡å
Javaãã¬ãŒãã³ã°ããªã³ã©ã€ã³ã§è¡ãïŒ
ããã°ã©ãã³ã°ã³ãŒã¹ã¯ãã¡ãïŒ
ãJava Coreã³ãŒã¹ã®åèšèš
ã®äžç°ãšããŠãã¬ãŒãã³ã°è³æã®äžéšãå
¬éã
ãŠããŸã ã
ãã®èšäºã§ã¯ãèŠèŽè
ã®è¬çŸ©ã®ãããªé²ç»ã
youtubeãã£ã³ãã«ã§èŠãããšãã§ããŸããããããã
ãã£ã³ãã«ã®ãããªãããäœç³»åãã
ãŠããŸã ã
ã¹ã«ã€ãïŒGolovachCourses
ã¡ãŒã«ïŒGolovachCourses@gmail.com