SlideShare une entreprise Scribd logo
1  sur  59
Télécharger pour lire hors ligne
© 2013 EIICHI KIMURA. All Rights Reserved. 1
JJUG CCC 2013 Spring - [R5-3] #ccc_r53
Type Annotationって何 ?
それを使うとプログラムはどう変わる ?
2013/5/11
木村英一(@kimuchi583)
2013/5/11 15:15-16:05
某メーカー/SIer で Java 技術支援や、新機能をいち早く普
及展開することに精力を注いでいます。ただ、イマイチ、新し
いバージョンに移ってくれないのが悩みのタネ。Java との出会
いは v1.02 の頃。あれよ、あれよという間に 17年もってしまいま
した。乗り鉄 & 撮り鉄。
WebSite(1) ー "Java etc..." - http://kimuchi583.at.webry.info/
WebSIte(2) ー http://blog.kimu2.jp/
Tweitter ー @kimuchi583
2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved. 2
木村って、どこのどいつ ?
© 2013 EIICHI KIMURA. All Rights Reserved. 3
Annotationについて
2013/5/11 15:15-16:05
Java5から導入されたアノテーション
使ったことありますか ?
@Deprecated
@Override
@SupressWarnings
@SafeVarargs(Java SE 7 から)
© 2013 EIICHI KIMURA. All Rights Reserved. 42013/5/11 15:15-16:05
Java8には82個のアノテーションが定義されている
© 2013 EIICHI KIMURA. All Rights Reserved. 5
ANNOTATION_TYPE
(アノテーション型)
PACKAGE
(パッケージ)
TYPE
(型・クラス)
FIELD
(フィールド)
METHOD
(メソッド)
CONSTRUCTOR
(コンストラクタ)
PARAMETER
(パラメータ)
LOCAL_VARIABLE
(ローカル変数)
TYPE_PARAMETER
(型パラメータ)
TYPE_USE
(型の利用)
型アノテーション
1 javax.xml.ws Action JAX-WS 2.1 〇 〇 〇
2 javax.xml.ws.soap Addressing JAX-WS 2.1 〇 〇 〇 〇 〇
3 javax.xml.ws BindingType JAX-WS 2.0 〇 〇 〇
4 java.beans ConstructorProperties Java SE 6 〇 〇 〇
5 java.lang Deprecated Java SE 5.0 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇
6 javax.management DescriptorKey Java SE 6 〇 〇 〇
7 java.lang.annotation Documented Java SE 5.0 〇 〇 〇
8 javax.xml.ws FaultAction JAX-WS 2.1 〇 〇 〇
9 java.lang FunctionalInterface Java SE 8 〇 〇 〇
10 javax.annotation Generated Common Annotation 1.0 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇
11 javax.tools.annotation GenerateNativeHeader Java SE 8 〇 〇 〇
12 javax.jws HandlerChain 〇 〇 〇 〇
13 java.lang.annotation Inherited Java SE 5.0 〇 〇 〇
14 javax.jws.soap InitParam 〇
15 javax.xml.ws.soap MTOM JAX-WS 2.1 〇 〇 〇 〇 〇 〇
16 javax.management MXBean Java SE 6 〇 〇 〇
17 java.lang.annotation Native Java SE 8 〇 〇 〇
18 javax.jws Oneway 〇 〇
19 java.lang Override Java SE 5.0 〇 〇
20 javax.annotation PostConstruct Common Annotation 1.0 〇 〇 〇
21 javax.annotation PreDestroy Common Annotation 1.0 〇 〇 〇
22 java.lang.annotation Repeatable Java SE 8 〇 〇 〇
23 javax.xml.ws RequestWrapper JAX-WS 2.0 〇 〇 〇
24 javax.annotation Resource Common Annotation 1.0 〇 〇 〇 〇
25 javax.annotation Resources Common Annotation 1.0 〇 〇 〇
26 javax.xml.ws RespectBinding JAX-WS 2.1 〇 〇 〇 〇 〇 〇
27 javax.xml.ws ResponseWrapper JAX-WS 2.0 〇 〇 〇
28 java.lang.annotation Retention Java SE 5.0 〇 〇 〇
29 java.lang SafeVarargs Java SE 7 〇 〇 〇 〇
30 javax.xml.ws ServiceMode JAX-WS 2.0 〇 〇 〇 〇
31 javax.jws.soap SOAPBinding 〇 〇 〇
32 javax.jws.soap SOAPMessageHandler 〇
33 javax.jws.soap SOAPMessageHandlers 〇 〇 〇
34 javax.annotation.processing SupportedAnnotationTypes Java SE 6 〇 〇 〇
35 javax.annotation.processing SupportedOptions Java SE 6 〇 〇 〇
36 javax.annotation.processing SupportedSourceVersion Java SE 6 〇 〇 〇
37 java.lang SuppressWarnings Java SE 5.0 〇 〇 〇 〇 〇 〇 〇
38 java.lang.annotation Target 〇 〇 〇
39 java.beans Transient Java SE 7 〇 〇
40 javax.xml.ws WebEndpoint JAX-WS 2.0 〇 〇 〇
41 javax.xml.ws WebFault JAX-WS 2.0 〇 〇 〇
42 javax.jws WebMethod 〇 〇
43 javax.jws WebParam 〇 〇
44 javax.jws WebResult 〇 〇
45 javax.jws WebService 〇 〇
46 javax.xml.ws WebServiceClient JAX-WS 2.0 〇 〇 〇
47 javax.xml.ws.spi WebServiceFeatureAnnotation JAX-WS 2.1 〇 〇 〇
48 javax.xml.ws WebServiceProvider JAX-WS 2.0 〇 〇 〇
49 javax.xml.ws WebServiceRef JAX-WS 2.0 〇 〇 〇 〇 〇
50 javax.xml.ws WebServiceRefs JAX-WS 2.0 〇 〇 〇
51 javax.xml.bind.annotation XmlAccessorOrder JAXB 2.0 〇 〇 〇 〇
52 javax.xml.bind.annotation XmlAccessorType JAXB 2.0 〇 〇 〇 〇
53 javax.xml.bind.annotation XmlAnyAttribute JAXB 2.0 〇 〇 〇
54 javax.xml.bind.annotation XmlAnyElement JAXB 2.0 〇 〇 〇
55 javax.xml.bind.annotation XmlAttachmentRef JAXB 2.0 〇 〇 〇 〇
56 javax.xml.bind.annotation XmlAttribute JAXB 2.0 〇 〇 〇
57 javax.xml.bind.annotation XmlElement JAXB 2.0 〇 〇 〇 〇
58 javax.xml.bind.annotation XmlElementDecl JAXB 2.0 〇 〇
59 javax.xml.bind.annotation XmlElementRef JAXB 2.0 〇 〇 〇
60 javax.xml.bind.annotation XmlElementRefs JAXB 2.0 〇 〇 〇
61 javax.xml.bind.annotation XmlElements JAXB 2.0 〇 〇 〇
62 javax.xml.bind.annotation XmlElementWrapper JAXB 2.0 〇 〇 〇
63 javax.xml.bind.annotation XmlEnum JAXB 2.0 〇 〇
64 javax.xml.bind.annotation XmlEnumValue JAXB 2.0 〇 〇
65 javax.xml.bind.annotation XmlID JAXB 2.0 〇 〇 〇
66 javax.xml.bind.annotation XmlIDREF JAXB 2.0 〇 〇 〇
67 javax.xml.bind.annotation XmlInlineBinaryData JAXB 2.0 〇 〇 〇 〇
68 javax.xml.bind.annotation.adapters XmlJavaTypeAdapter JAXB 2.0 〇 〇 〇 〇 〇 〇
69 javax.xml.bind.annotation.adapters XmlJavaTypeAdapters JAXB 2.0 〇 〇
70 javax.xml.bind.annotation XmlList JAXB 2.0 〇 〇 〇 〇
71 javax.xml.bind.annotation XmlMimeType JAXB 2.0 〇 〇 〇 〇
72 javax.xml.bind.annotation XmlMixed JAXB 2.0 〇 〇 〇
73 javax.xml.bind.annotation XmlNs JAXB 2.0 〇
74 javax.xml.bind.annotation XmlRegistry JAXB 2.0 〇 〇
75 javax.xml.bind.annotation XmlRootElement JAXB 2.0 〇 〇
76 javax.xml.bind.annotation XmlSchema JAXB 2.0 〇 〇
77 javax.xml.bind.annotation XmlSchemaType JAXB 2.0 〇 〇 〇 〇
78 javax.xml.bind.annotation XmlSchemaTypes JAXB 2.0 〇 〇
79 javax.xml.bind.annotation XmlSeeAlso JAXB 2.1 〇 〇
80 javax.xml.bind.annotation XmlTransient JAXB 2.0 〇 〇 〇 〇
81 javax.xml.bind.annotation XmlType JAXB 2.0 〇 〇
82 javax.xml.bind.annotation XmlValue JAXB 2.0 〇 〇 〇
@Deprecated @Documented @WebServiceFeatureAnnotation@Inherited
Java SE 8~
宣言アノテーション
@Target @Retention
Java SE 5.0 ~
# 導入バージョン
RUNTIME SOURCE
アノテーション型
パッケージ アノテーション名
2013/5/11 15:15-16:05
これ以外に、JavaEEなど他のAPIでも使われています
 Java EE 6 - Servlet, EJB
 @EJB, @Stateless, @Stateful,
@Singleton, ...
 @WebServlet, @WebFilter, @WebListener, ...
 CDI
 @Model, @SessionScope, @Inject, ...
 JPA
 @Entity, @Table, @ID, @OneToMany, ...
© 2013 EIICHI KIMURA. All Rights Reserved. 62013/5/11 15:15-16:05
もちろん、自分でも作れます...
アノテーション型 : Annotation Type
public @interface Copyright {
String value();
}
© 2013 EIICHI KIMURA. All Rights Reserved. 72013/5/11 15:15-16:05
JavaSE5~7で使えるアノテーション型のソース
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override { }
@Target( // "ElementType." は省略してます ...
{ TYPE, FIELD, METHOD, PARAMETER,
CONSTRUCTOR, LOCAL_VARIABLE })
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings
{ String[] value(); }
© 2013 EIICHI KIMURA. All Rights Reserved. 82013/5/11 15:15-16:05
アノテーションの利用例:Java8のソースから引用
 String クラスの コンストラクタ
@Deprecated
public String(byte ascii[], int hibyte) {
this(ascii, hibyte, 0, ascii.length);
}
 Interger クラスの hashCode メソッド
@Override
public int hashCode() {
return Integer.hashCode(value);
}
© 2013 EIICHI KIMURA. All Rights Reserved. 92013/5/11 15:15-16:05
2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved. 10
TypeAnnotationについて
アノテーション型 :
Annotation Type
と
型アノテーション :
Type Annotation
は違います !!
© 2013 EIICHI KIMURA. All Rights Reserved. 112013/5/11 15:15-16:05
アノテーション型には2種類あります
 宣言アノテーション
 @Target が ElementType.TYPE_USE 以外のアノテーション
 ElementType.ANNOTATION_TYPE
 ElementType.CONSTRUCTOR
 ElementType.FIELD
 ElementType.LOCAL_VARIABLE
 ElementType.METHOD
 ElementType.PACKAGE
 ElementType.PARAMETER
 ElementType.TYPE
 ElementType.TYPE_PARAMETER : @since JDK8
 型アノテーション
 @Target が ElementType.TYPE_USE のアノテーション
© 2013 EIICHI KIMURA. All Rights Reserved. 122013/5/11 15:15-16:05
JavaSE5~7のアノテーションは
宣言アノテーション
 宣言対象に対するアノテーションのみ
 パッケージ宣言、クラス・インタフェース宣言、メソッド・コンスト
ラクタ宣言、フィールド宣言、メソッドの仮引数宣言、ローカ
ル変数宣言の箇所で使用できた。
 (除く) ジェネリックの型パラメータ宣言
 型利用に対するアノテーションはできない
© 2013 EIICHI KIMURA. All Rights Reserved. 132013/5/11 15:15-16:05
JavaSE8で型の使用に対しても記述できるようにする
型アノテーション
 宣言に対してではなく、型の利用に対して利用できる。
 たとえば、型限定子として、
 メソッド仮引数、メソッド返却、レシーバの型の使用に対して
 ジェネリックの型パラメータ、キャストでの型の利用に対して
 (除) import 文、クラスリテラル(XXX.class)、static メンバアク
セスのクラス名, アノテーション ⇒ これらは、型の使用とは解釈
されない。
© 2013 EIICHI KIMURA. All Rights Reserved. 142013/5/11 15:15-16:05
2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved. 15
言語仕様上は...
型アノテーションを利用する構文のみ規定している
 型アノテーションを利用できる構文を規定
型が使われている箇所に前置する
© 2013 EIICHI KIMURA. All Rights Reserved. 162013/5/11 15:15-16:05
例1.クラス周りでは
 コンストラクタ呼出し(オブジェクト生成)
 new @Interned MyObject()
 new @NonEmpty @Readonly
List<String>(myNonEmptyStringSet)
 myVar . new @Tainted NestedClass()
 クラス継承
 class UnmodifiableList<T> implements
@Readonly List<@Readonly T> { ... }
© 2013 EIICHI KIMURA. All Rights Reserved. 172013/5/11 15:15-16:05
例2.式・文まわりでは
 throws 句
 void monitorTemperature() throws
@Critical TemperatureException { ... }
 キャスト式
 myString = (@NonNull String) myObject;
 instanceof 式(型検査)
 boolean isNonNull =
myString instanceof @NonNull String;
© 2013 EIICHI KIMURA. All Rights Reserved. 182013/5/11 15:15-16:05
例3.ジェネリック周りでは...
 ジェネリッククラスの型アーギュメント
 Map<@NonNull String,
@NonEmpty List<@Readonly Document>>
files;
 ジェネリックメソッド・コンストラクタ呼出し時の型アーギュメ
ント
 o.<@NonNull String>m("...");
 ジェネリックの型制約(bounds)
 class Folder<F extends @Existing File>
{ ... }
 Collection<? super @Existing File>
© 2013 EIICHI KIMURA. All Rights Reserved. 192013/5/11 15:15-16:05
例4.配列周りでは... 指定場所で意味が変わる
 @Readonly Doc[][] d1 = new @Readonly Doc [2][12];
// "read-only な Doc" の配列の配列
 Doc @Readonly [][] d2 = new Doc @Readonly [2][12];
// Doc の配列の "read-only な配列"
 Doc[] @Readonly [] d3 = new Doc[2] @Readonly [12];
// Doc の "read-only な配列" の配列
© 2013 EIICHI KIMURA. All Rights Reserved. 202013/5/11 15:15-16:05
例5.レシーバ用にメソッド引数宣言の構文が拡張!
 インスタンスメソッドのレシーバ(this)
 [通常のコード] は this を引数に書かない
class MyClass {
...
public String toString() { ... }
public boolean equals(Object other) { ... }
}
 [レシーバに型アノテーションを指定する] ときは this 引数宣言する
class MyClass {
...
public String toString(@Readonly MyClass this)
{ ... }
public boolean equals(@Readonly MyClass this,
@Readonly Object other)
{ ... }
}
© 2013 EIICHI KIMURA. All Rights Reserved. 212013/5/11 15:15-16:05
例6.型利用でない場所-型アノテーションが書けず!!
 アノテーション型に対するアノテーション
 クラスリテラル
Class c = @NonNull Integer.class; // NG
Class c = Integer @NonNull[].class; // NG
 import 文
import java.lang.@Interned String; // NG
import @Interned java.lang.String; // NG
 static メンバアクセス
 @Interned String . valueOf(10); // NG
© 2013 EIICHI KIMURA. All Rights Reserved. 222013/5/11 15:15-16:05
 @NonNull
 @Interned
 @ReadOnly
 @NotEmpty
 @Critical
 @Tainted
 @Existing
使いたくなりましたか?
2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved. 23
型アノテーションの意味は規定しない
しかし
型アノテーションの
意味(セマンティック)は規定しない !!
つまり、利用イメージの例を紹介しましたが、
Java 言語仕様で、これらの型アノテーション
の意味は規定していない。
© 2013 EIICHI KIMURA. All Rights Reserved. 242013/5/11 15:15-16:05
型アノテーションの意味は規定しない
さらに
Java SE 8 で
事前定義された型アノテーションは
(今のところ)ない !!
型アノテーションの提供側が、
その型アノテーションと、その意味との両方を与える。
© 2013 EIICHI KIMURA. All Rights Reserved. 252013/5/11 15:15-16:05
2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved. 26
CheckerFramework
© 2013 EIICHI KIMURA. All Rights Reserved. 272013/5/11 15:15-16:05
 v1.6.3 - 2013/5/1 版
 http://types.cs.washington.edu/checker-framework/
 Windows 版の起動方法
 java -jar %CHECKERS%¥binary¥checkers.jar
-processor checkers.nullness.NullnessChecker
xxx.java
 java は JDK6, JDK7 でも OK !!
2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved. 28
CheckerFramework
提供されるチェッカ
1. Nullness checker : ヌルポインターエラーチェック用
2. Interning checker : intern 化と等価検査エラーチェック用
3. Lock checker :並行処理とロック関連エラーチェック用
4. Fake enum checker : 型安全 enum パターンの許可向け
5. Tainting checker : 信頼性とセキュリティエラーチェック用
6. Regex checker : 構文不正の正規表現チェック用
7. Property file checker : プロパティ、リソースバンドル利用時の妥当にキーを使用しているかの
チェック用(国際化含)。
8. Signature string checker : 型の文字列表現を適切に利用しているかのチェック用
(Class.forName()など)。
9. Units checker : 正しい計測単位で処理されているかのチェック用
10. Linear checker : 別名及び、再利用の制御向け
11. IGJ checker : 可変エラー(不正な副作用)向け(IGJ 型システム)
12. Javari checker : 可変エラー(不正な副作用)向け(Javari型システム)
13. Basic checker : カスタマイズ検査用
14. Typestate checker : オブジェクトの正しい状態で処理が行われているかのチェック用
15.その他
© 2013 EIICHI KIMURA. All Rights Reserved. 292013/5/11 15:15-16:05
© 2013 EIICHI KIMURA. All Rights Reserved. 302013/5/11 15:15-16:05
NullPointerException!!-従来は実行時エラー
public class GetStarted1 {
public static void main(String args[]) {
new GetStarted1().sample();
}
void sample() {
Object o_ref = null;
String s_ref = o_ref.toString();
}
}
> javac GetStarted1.java
> java GetStarted1
Exception in thread "main"
java.lang.NullPointerException
at GetStarted1.sample(GetStarted1.java:9)
at GetStarted1.main(GetStarted1.java:5)
© 2013 EIICHI KIMURA. All Rights Reserved. 312013/5/11 15:15-16:05
NullnessChecker- NonNullチェック(参照)
import checkers.nullness.quals.*;
public class GetStarted1 { // main()は割愛
void sample() {
Object o_ref = null;
String s_ref = o_ref.toString();
}
}
> java -jar %CHECKERS%¥binary¥checkers.jar
-processor checkers.nullness.NullnessChecker
GetStarted1.java
GetStarted1.java:6: エラー:
dereference of possibly-null reference ref
String s_ref = o_ref.toString();
^
エラー1個
© 2013 EIICHI KIMURA. All Rights Reserved. 322013/5/11 15:15-16:05
NullnessChecker- NonNullチェック(代入)
import checkers.nullness.quals.*;
public class GetStarted1 { // main()は割愛
void sample() {
@NonNull Object o_ref = null;
String s_ref = o_ref.toString();
}
}
java -jar %CHECKERS%¥binary¥checkers.jar
-processor checkers.nullness.NullnessChecker GetStarted1.java
GetStarted1.java:5: エラー:
incompatible types in assignment.
@NonNull Object ref = null;
^
found : null
required: @NonNull Object
エラー1個
© 2013 EIICHI KIMURA. All Rights Reserved. 332013/5/11 15:15-16:05
NullnessChecker- 冗長コードの指摘
import checkers.nullness.quals.*;
public class GetStarted1 { // main()は割愛
void sample() {
@NonNull String s_ref = "xxxx";
if(s_ref != null) System.out.println(s_ref);
}
}
java -jar %CHECKERS%¥binary¥checkers.jar -Alint
-processor checkers.nullness.NullnessChecker GetStarted1.java
GetStarted1.java:9: 警告:
redundant check; "ref" is non-null
if (ref != null) {
System.out.println(ref.toString()); }
^
警告1個
© 2013 EIICHI KIMURA. All Rights Reserved. 342013/5/11 15:15-16:05
NullnessChecker- 冗長コードの指摘
import checkers.nullness.quals.*;
public class GetStarted1 { // main()は割愛
@Nullable String getXXXX() { return "xxxx"; }
void sample() {
@NonNull String s_ref = getXXXX();
}
}
java -jar %CHECKERS%¥binary¥checkers.jar
-processor checkers.nullness.NullnessChecker GetStarted1.java
GetStarted1.java:11: エラー:
incompatible types in assignment.
@NonNull String ref = getXXXX();
^
found : @Nullable String
required: @NonNull String
エラー1個
© 2013 EIICHI KIMURA. All Rights Reserved. 352013/5/11 15:15-16:05
NullnessChecker- 警告抑制
import checkers.nullness.quals.*;
public class GetStarted1 { // main()は割愛
@Nullable String getXXXX() { return "xxxx"; }
@SuppressWarnings("nullness")
void sample() {
@NonNull String s_ref = getXXXX();
}
}
java -jar %CHECKERS%¥binary¥checkers.jar
-processor checkers.nullness.NullnessChecker GetStarted1.java
© 2013 EIICHI KIMURA. All Rights Reserved. 362013/5/11 15:15-16:05
© 2013 EIICHI KIMURA. All Rights Reserved. 372013/5/11 15:15-16:05
InterningChecker
import checkers.interning.quals.*;
public class InternedTest {
public static void main(String aegs[]) {
@Interned String s1 = new @Interned String("aaa");
@Interned String s2 = new @Interned String("aaa");
String s3 = new String("aaa");
if(s1 == s2) { System.out.println("s1 == s2"); }
if(s1 == s3) { System.out.println("s1 == s3"); }
if(s2 == s3) { System.out.println("s2 == s3"); }
if(s1.equals(s2)) { System.out.println("s1.equlas(s2)");}
if(s1.equals(s3)) { System.out.println("s1.equlas(s3)"); }
if(s2.equals(s3)) { System.out.println("s2.equlas(s3)"); }
}
}
© 2013 EIICHI KIMURA. All Rights Reserved. 382013/5/11 15:15-16:05
java -jar %CHECKERS%¥binary¥checkers.jar
-processor checkers.interning.InternedChecker
InternedTest.java
InternedTest.java:10: エラー:
attempting to use a non-@Interned comparison operand
if(s1 == s3) { System.out.println("s1 == s3"); }
^
found: String
InternedTest.java:11: エラー:
attempting to use a non-@Interned comparison operand
if(s2 == s3) { System.out.println("s2 == s3"); }
^
found: String
InternedTest.java:12: 警告:
use of .equals can be safely replaced by ==/!=
if(s1.equals(s2)) { System.out.println("s1.equlas(s2)");}
^
エラー2個
警告1個
© 2013 EIICHI KIMURA. All Rights Reserved. 392013/5/11 15:15-16:05
InterningChecker
import checkers.interning.quals.*;
public class InternedTest {
public static void main(String aegs[]) {
@Interned String s1 = new @Interned String("aaa");
@Interned String s2 = new @Interned String("aaa");
String s3 = new String("aaa");
if(s1 == s2) { System.out.println("s1 == s2"); }
// if(s1 == s3) { System.out.println("s1 == s3"); }
// if(s2 == s3) { System.out.println("s2 == s3"); }
if(s1.equals(s2)) { System.out.println("s1.equlas(s2)");}
if(s1.equals(s3)) { System.out.println("s1.equlas(s3)"); }
if(s2.equals(s3)) { System.out.println("s2.equlas(s3)"); }
}
}
© 2013 EIICHI KIMURA. All Rights Reserved. 402013/5/11 15:15-16:05
エラー部分をコメントにして、実行してみると...
>java InternedTest
s1.equlas(s2)
s1.equlas(s3)
s2.equlas(s3)
"s1 == s2" が表示さない !!
@Interned 同士の "==" は false
つまり、"s1 != s2" である。
実行時の結果保証まではしない !!
© 2013 EIICHI KIMURA. All Rights Reserved. 412013/5/11 15:15-16:05
InterningChecker
import checkers.interning.quals.*;
public class InternedTest {
public static void main(String aegs[]) {
@Interned String s1 = (new String("aaa")).intern();
@Interned String s2 = (new String("aaa")).intern();
String s3 = new String("aaa");
if(s1 == s2) { System.out.println("s1 == s2"); }
// if(s1 == s3) { System.out.println("s1 == s3"); }
// if(s2 == s3) { System.out.println("s2 == s3"); }
if(s1.equals(s2)) { System.out.println("s1.equlas(s2)");}
if(s1.equals(s3)) { System.out.println("s1.equlas(s3)"); }
if(s2.equals(s3)) { System.out.println("s2.equlas(s3)"); }
}
}
© 2013 EIICHI KIMURA. All Rights Reserved. 422013/5/11 15:15-16:05
エラー部分をコメントにして、実行してみると...
>java InternedTest
s1 == s2
s1.equlas(s2)
s1.equlas(s3)
s2.equlas(s3)
intern()を呼出すのはプログラマの責任
© 2013 EIICHI KIMURA. All Rights Reserved. 432013/5/11 15:15-16:05
© 2013 EIICHI KIMURA. All Rights Reserved. 442013/5/11 15:15-16:05
finalフィールドって、何がfinal - エラーになるのは ?
public class ImmutableTest1 {
static final int[][] iaa = new int[10][10];
static {
for(int i = 0; i < 10; i++) {
for(int j = 0; j < 10; j++) {
iaa[i][j] = i*10 + j;
}
}
}
public static void main(String args[]) {
iaa[0][0] = 100; // (1)
iaa[1] = new int[10]; // (2)
iaa = new int[10][10]; // (3)
}
}
© 2013 EIICHI KIMURA. All Rights Reserved. 452013/5/11 15:15-16:05
ImmutableTest1.java:14: エラー:
final変数iaaに値を代入することはできません
iaa = new int[10][10]; //(3)
^
エラー1個
© 2013 EIICHI KIMURA. All Rights Reserved. 46
iaa [0]
[1]
[2]
[3]
[9]
[0]
[0]
[0]
[1]
[0]
[2]
[0]
[3]
[0]
[9]
[1]
[0]
[1]
[1]
[1]
[2]
[1]
[3]
[1]
[9]
[2]
[0]
[2]
[1]
[2]
[2]
[2]
[3]
[2]
[9]
[3]
[0]
[3]
[1]
[3]
[2]
[3]
[3]
[3]
[9]
[9]
[0]
[9]
[1]
[9]
[2]
[9]
[3]
[9]
[9]
: ...
...
...
...
...
...
: : : : ::
[0]
[1]
[2]
[3]
[9]
[0]
[0]
[0]
[1]
[0]
[2]
[0]
[3]
[0]
[9]
[1]
[0]
[1]
[1]
[1]
[2]
[1]
[3]
[1]
[9]
[2]
[0]
[2]
[1]
[2]
[2]
[2]
[3]
[2]
[9]
[3]
[0]
[3]
[1]
[3]
[2]
[3]
[3]
[3]
[9]
[9]
[0]
[9]
[1]
[9]
[2]
[9]
[3]
[9]
[9]
: ...
...
...
...
...
...
: : : : ::
ここが
final
2013/5/11 15:15-16:05
では、要素を変更できないようにするには(1)
public class ImmutableTest1 {
static final int @ReadOnly[][] iaa =
new int[10][10];
public static void main(String args[]) {
iaa[0][0] = 100; // (1)
iaa[1] = new int[10]; // (2)
// iaa = new int[10][10]; // (3)
}
}
ImmutableTest2.java:17: エラー:
Cannot (re-)assign iaa through the reference:
@IGJBottom int @ReadOnly [] @Mutable []
iaa[1] = new int[10]; // (2)
^
エラー1個
© 2013 EIICHI KIMURA. All Rights Reserved. 472013/5/11 15:15-16:05
© 2013 EIICHI KIMURA. All Rights Reserved. 48
iaa [0]
[1]
[2]
[3]
[9]
[0]
[0]
[0]
[1]
[0]
[2]
[0]
[3]
[0]
[9]
[1]
[0]
[1]
[1]
[1]
[2]
[1]
[3]
[1]
[9]
[2]
[0]
[2]
[1]
[2]
[2]
[2]
[3]
[2]
[9]
[3]
[0]
[3]
[1]
[3]
[2]
[3]
[3]
[3]
[9]
[9]
[0]
[9]
[1]
[9]
[2]
[9]
[3]
[9]
[9]
: ...
...
...
...
...
...
: : : : ::
[0]
[1]
[2]
[3]
[9]
[0]
[0]
[0]
[1]
[0]
[2]
[0]
[3]
[0]
[9]
[1]
[0]
[1]
[1]
[1]
[2]
[1]
[3]
[1]
[9]
[2]
[0]
[2]
[1]
[2]
[2]
[2]
[3]
[2]
[9]
[3]
[0]
[3]
[1]
[3]
[2]
[3]
[3]
[3]
[9]
[9]
[0]
[9]
[1]
[9]
[2]
[9]
[3]
[9]
[9]
: ...
...
...
...
...
...
: : : : ::
ここが
final
ここが
@ReadOnly
2013/5/11 15:15-16:05
では、要素を変更できないようにするには(2)
public class ImmutableTest1 {
static final int @ReadOnly[] @ReadOnly[] iaa =
new int[10][10];
public static void main(String args[]) {
iaa[0][0] = 100; // (1)
iaa[1] = new int[10]; // (2)
// iaa = new int[10][10]; // (3)
}
}
© 2013 EIICHI KIMURA. All Rights Reserved. 492013/5/11 15:15-16:05
では、要素を変更できないようにするには
ImmutableTest2.java:16: エラー:
Cannot (re-)assign iaa through the reference:
@IGJBottom int @ReadOnly []
iaa[0][0] = 100; // (1)
^
ImmutableTest2.java:17: エラー:
Cannot (re-)assign iaa through the reference:
@IGJBottom int @ReadOnly [] @ReadOnly []
iaa[1] = new int[10]; // (2)
^
エラー2個
© 2013 EIICHI KIMURA. All Rights Reserved. 502013/5/11 15:15-16:05
© 2013 EIICHI KIMURA. All Rights Reserved. 51
iaa [0]
[1]
[2]
[3]
[9]
[0]
[0]
[0]
[1]
[0]
[2]
[0]
[3]
[0]
[9]
[1]
[0]
[1]
[1]
[1]
[2]
[1]
[3]
[1]
[9]
[2]
[0]
[2]
[1]
[2]
[2]
[2]
[3]
[2]
[9]
[3]
[0]
[3]
[1]
[3]
[2]
[3]
[3]
[3]
[9]
[9]
[0]
[9]
[1]
[9]
[2]
[9]
[3]
[9]
[9]
: ...
...
...
...
...
...
: : : : ::
[0]
[1]
[2]
[3]
[9]
[0]
[0]
[0]
[1]
[0]
[2]
[0]
[3]
[0]
[9]
[1]
[0]
[1]
[1]
[1]
[2]
[1]
[3]
[1]
[9]
[2]
[0]
[2]
[1]
[2]
[2]
[2]
[3]
[2]
[9]
[3]
[0]
[3]
[1]
[3]
[2]
[3]
[3]
[3]
[9]
[9]
[0]
[9]
[1]
[9]
[2]
[9]
[3]
[9]
[9]
: ...
...
...
...
...
...
: : : : ::
ここが
final
ここが
@ReadOnly
ここも
@ReadOnly
2013/5/11 15:15-16:05
@Immutablevs.@ReadOnly
@Immutable はインスタンスの内容の変更ができない
@ReadOnly は、その参照を通してのみ内容変更ができない。
© 2013 EIICHI KIMURA. All Rights Reserved. 522013/5/11 15:15-16:05
GregorianCalendar gc2 = new GregorianCalendar();
GregorianCalendar gc3 = new GregorianCalendar();
@Immutable GregorianCalendar im_gc1 =
new @Immutable GregorianCalendar(); // OK
@Immutable GregorianCalendar im_gc2 = gc2; // NG
@ReadOnly GregorianCalendar ro_gc = gc3; // OK
gc2.add(Calendar.DAY_OF_MONTH, 1); // OK
gc3.add(Calendar.DAY_OF_MONTH, 1); // OK
ro_gc.add(Calendar.DAY_OF_MONTH, 1); // NG
参照とデータ変更の関係図(前頁のコード)
© 2013 EIICHI KIMURA. All Rights Reserved. 53
gc2
gc3
Gregorian
Calendar
Gregorian
Calendar
im_gc1
Gregorian
Calendar
@Immutable
im_gc2
@Immutable
@Immutable
ro_gc
@ReadOnly
参照 OK
変更 OK
参照 OK
変更 OK
参照 NG
変更 ---
参照 OK
変更 NG
参照 OK
変更 NG
2013/5/11 15:15-16:05
2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved. 54
無印(@Mutable) vs @ReadOnly vs. @Immutable
g_cal
Gregorian
Calendar
im_g_cal
Gregorian
Calendar
@Immutable
@Immutable
ro_g_cal
参照 OK
変更 OK
参照 OK
変更 NG
Gregorian
Calendar
@ReadOnly
参照 OK
変更 NG
@ReadOnly
参照 OK
変更 NG
参照 OK
変更 NG
 //*>>> import checkers.nullness.quals.*;*/
public class GetStarted1 { // main()は割愛
void sample() {
/*@NonNull*/ Object o_ref = null;
String s_ref = o_ref.toString();
}
}
 class MyClass {
...
public String toString(/*>>> @Readonly MyClass this*/)
{ ... }
public boolean equals(/*>>> @Readonly MyClass this,
@Readonly*/ Object other)
{ ... }
}
CheckerFrameworkはJDK7でも使える
2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved. 55
2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved. 56
JavaSE8EarlyAccess
JavaSE8EarlyAccess
 Java SE 8 Early Access b89('13/5/9現在)
 http://jdk8.java.net/download.html
 Type Annotation を作れます
 Type Annotation 構文を認識します
 型アノテーションを記述していなくても this 引数をインスタンスメ
ソッドの最初に引数に記述できる
© 2013 EIICHI KIMURA. All Rights Reserved. 572013/5/11 15:15-16:05
 型アノテーションは型の使用に対するアノテーション
 実行時エラーになる前、コンパイル時にできるだけバグ
の芽をつむために利用できる
 ただ、JDK8 で標準的な型アノテーションはない
 ツールなどで用意されているものをうまく活用しよう
 Checker Framework は、その選択肢の一つ
 ソースコードがごちゃごちゃする感も否めない
 自分で型アノテーションを作ることもできる
まとめ
2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved. 58
2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved 59
おわり

Contenu connexe

Tendances

20141018 selenium appium_cookpad
20141018 selenium appium_cookpad20141018 selenium appium_cookpad
20141018 selenium appium_cookpadKazuaki Matsuo
 
20121019 jenkins勉強会lt資料
20121019 jenkins勉強会lt資料20121019 jenkins勉強会lt資料
20121019 jenkins勉強会lt資料Hiroko Tamagawa
 
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)Yuuki Fukuda
 
ディープラーニングとAppiumでモバイルテスト自動化
ディープラーニングとAppiumでモバイルテスト自動化ディープラーニングとAppiumでモバイルテスト自動化
ディープラーニングとAppiumでモバイルテスト自動化Nozomi Ito
 
詳解!自動結合テスト #jasst
詳解!自動結合テスト #jasst詳解!自動結合テスト #jasst
詳解!自動結合テスト #jasstkyon mm
 
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsWildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsYoshimasa Tanabe
 
iOSアプリ UIテスト自動化入門
iOSアプリ UIテスト自動化入門iOSアプリ UIテスト自動化入門
iOSアプリ UIテスト自動化入門Shingo Tamaki
 
「GebとSpockではじめるシステムテスト自動化」
「GebとSpockではじめるシステムテスト自動化」「GebとSpockではじめるシステムテスト自動化」
「GebとSpockではじめるシステムテスト自動化」Hiroyuki Ohnaka
 
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframeworkSpring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframeworkToshiaki Maki
 
メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −
メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −
メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −JustSystems Corporation
 
STFとAppiumをもちいたAndroidアプリの自動テスト
STFとAppiumをもちいたAndroidアプリの自動テストSTFとAppiumをもちいたAndroidアプリの自動テスト
STFとAppiumをもちいたAndroidアプリの自動テストToshiyuki Hirata
 
Introduction to WildFly Swarm
Introduction to WildFly SwarmIntroduction to WildFly Swarm
Introduction to WildFly SwarmYoshimasa Tanabe
 
Spring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のことSpring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のこと心 谷本
 
Spring frameworkが大好きなおはなし
Spring frameworkが大好きなおはなしSpring frameworkが大好きなおはなし
Spring frameworkが大好きなおはなしSatoshi Kisanuki
 
実践で学ぶ、効率的な自動テストスクリプトのメンテナンス
実践で学ぶ、効率的な自動テストスクリプトのメンテナンス実践で学ぶ、効率的な自動テストスクリプトのメンテナンス
実践で学ぶ、効率的な自動テストスクリプトのメンテナンスNozomi Ito
 
ビルドプロセスとCI #STAC2014
ビルドプロセスとCI #STAC2014ビルドプロセスとCI #STAC2014
ビルドプロセスとCI #STAC2014Koji Hasegawa
 
エンドツーエンドテストを自動化したらチームがすごく良くなった@XPまつり2015LT
エンドツーエンドテストを自動化したらチームがすごく良くなった@XPまつり2015LTエンドツーエンドテストを自動化したらチームがすごく良くなった@XPまつり2015LT
エンドツーエンドテストを自動化したらチームがすごく良くなった@XPまつり2015LTTaichi Watanabe
 
Jsug2015 summer spring適用におけるバッドノウハウとベタープラクティス
Jsug2015 summer spring適用におけるバッドノウハウとベタープラクティスJsug2015 summer spring適用におけるバッドノウハウとベタープラクティス
Jsug2015 summer spring適用におけるバッドノウハウとベタープラクティスYoichi KIKUCHI
 

Tendances (20)

20141018 selenium appium_cookpad
20141018 selenium appium_cookpad20141018 selenium appium_cookpad
20141018 selenium appium_cookpad
 
20121019 jenkins勉強会lt資料
20121019 jenkins勉強会lt資料20121019 jenkins勉強会lt資料
20121019 jenkins勉強会lt資料
 
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
 
ディープラーニングとAppiumでモバイルテスト自動化
ディープラーニングとAppiumでモバイルテスト自動化ディープラーニングとAppiumでモバイルテスト自動化
ディープラーニングとAppiumでモバイルテスト自動化
 
詳解!自動結合テスト #jasst
詳解!自動結合テスト #jasst詳解!自動結合テスト #jasst
詳解!自動結合テスト #jasst
 
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsWildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE Apps
 
iOSアプリ UIテスト自動化入門
iOSアプリ UIテスト自動化入門iOSアプリ UIテスト自動化入門
iOSアプリ UIテスト自動化入門
 
「GebとSpockではじめるシステムテスト自動化」
「GebとSpockではじめるシステムテスト自動化」「GebとSpockではじめるシステムテスト自動化」
「GebとSpockではじめるシステムテスト自動化」
 
Stac2014 石川
Stac2014 石川Stac2014 石川
Stac2014 石川
 
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframeworkSpring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
 
メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −
メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −
メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −
 
STFとAppiumをもちいたAndroidアプリの自動テスト
STFとAppiumをもちいたAndroidアプリの自動テストSTFとAppiumをもちいたAndroidアプリの自動テスト
STFとAppiumをもちいたAndroidアプリの自動テスト
 
Introduction to WildFly Swarm
Introduction to WildFly SwarmIntroduction to WildFly Swarm
Introduction to WildFly Swarm
 
Spring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のことSpring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のこと
 
Spring frameworkが大好きなおはなし
Spring frameworkが大好きなおはなしSpring frameworkが大好きなおはなし
Spring frameworkが大好きなおはなし
 
実践で学ぶ、効率的な自動テストスクリプトのメンテナンス
実践で学ぶ、効率的な自動テストスクリプトのメンテナンス実践で学ぶ、効率的な自動テストスクリプトのメンテナンス
実践で学ぶ、効率的な自動テストスクリプトのメンテナンス
 
快適・簡単・安心なアプリE2Eテストの実行環境 #stac2017
快適・簡単・安心なアプリE2Eテストの実行環境 #stac2017快適・簡単・安心なアプリE2Eテストの実行環境 #stac2017
快適・簡単・安心なアプリE2Eテストの実行環境 #stac2017
 
ビルドプロセスとCI #STAC2014
ビルドプロセスとCI #STAC2014ビルドプロセスとCI #STAC2014
ビルドプロセスとCI #STAC2014
 
エンドツーエンドテストを自動化したらチームがすごく良くなった@XPまつり2015LT
エンドツーエンドテストを自動化したらチームがすごく良くなった@XPまつり2015LTエンドツーエンドテストを自動化したらチームがすごく良くなった@XPまつり2015LT
エンドツーエンドテストを自動化したらチームがすごく良くなった@XPまつり2015LT
 
Jsug2015 summer spring適用におけるバッドノウハウとベタープラクティス
Jsug2015 summer spring適用におけるバッドノウハウとベタープラクティスJsug2015 summer spring適用におけるバッドノウハウとベタープラクティス
Jsug2015 summer spring適用におけるバッドノウハウとベタープラクティス
 

En vedette

『JUnit実践入門』写経・実践会 in 横浜 #6 (特別編) #junitbook
『JUnit実践入門』写経・実践会 in 横浜 #6 (特別編) #junitbook『JUnit実践入門』写経・実践会 in 横浜 #6 (特別編) #junitbook
『JUnit実践入門』写経・実践会 in 横浜 #6 (特別編) #junitbookshinyaa31
 
テスト駆動開発を継続する
テスト駆動開発を継続するテスト駆動開発を継続する
テスト駆動開発を継続するirof N
 
地方における勉強会事情
地方における勉強会事情地方における勉強会事情
地方における勉強会事情Soudai Sone
 
システム設計の謎 ~べ、別にあんたのために設計してるんじゃないんだからね///~
システム設計の謎 ~べ、別にあんたのために設計してるんじゃないんだからね///~システム設計の謎 ~べ、別にあんたのために設計してるんじゃないんだからね///~
システム設計の謎 ~べ、別にあんたのために設計してるんじゃないんだからね///~terahide
 
失敗から学ぶAPI設計 #ccc_h4 #jjug #jjug_ccc JJUG CCC 2013 Spring
失敗から学ぶAPI設計  #ccc_h4 #jjug #jjug_ccc JJUG CCC 2013 Spring 失敗から学ぶAPI設計  #ccc_h4 #jjug #jjug_ccc JJUG CCC 2013 Spring
失敗から学ぶAPI設計 #ccc_h4 #jjug #jjug_ccc JJUG CCC 2013 Spring Yusuke Yamamoto
 
Junitを使ったjavaのテスト入門
Junitを使ったjavaのテスト入門Junitを使ったjavaのテスト入門
Junitを使ったjavaのテスト入門Satoshi Kubo
 
ユースケースからテスト駆動開発へ
ユースケースからテスト駆動開発へユースケースからテスト駆動開発へ
ユースケースからテスト駆動開発へShuji Watanabe
 
JUnitテストを1日やってみた
JUnitテストを1日やってみたJUnitテストを1日やってみた
JUnitテストを1日やってみたMima Yuki
 
第1回JUnit勉強会ハンズオン
第1回JUnit勉強会ハンズオン第1回JUnit勉強会ハンズオン
第1回JUnit勉強会ハンズオンequj65
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入Yu Nobuoka
 
Spring integration概要
Spring integration概要Spring integration概要
Spring integration概要kuroiwa
 
Jenkins user conference 東京
Jenkins user conference 東京Jenkins user conference 東京
Jenkins user conference 東京Kohsuke Kawaguchi
 
Jenkinsではじめる継続的インテグレーション
Jenkinsではじめる継続的インテグレーションJenkinsではじめる継続的インテグレーション
Jenkinsではじめる継続的インテグレーションMasanori Satoh
 
『JUnit実践入門』写経・実践会 in 横浜 #3
『JUnit実践入門』写経・実践会 in 横浜 #3『JUnit実践入門』写経・実践会 in 横浜 #3
『JUnit実践入門』写経・実践会 in 横浜 #3shinyaa31
 
Jenkinsを導入する本当の理由を考えてみた
Jenkinsを導入する本当の理由を考えてみたJenkinsを導入する本当の理由を考えてみた
Jenkinsを導入する本当の理由を考えてみたkakakikikeke
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 

En vedette (17)

『JUnit実践入門』写経・実践会 in 横浜 #6 (特別編) #junitbook
『JUnit実践入門』写経・実践会 in 横浜 #6 (特別編) #junitbook『JUnit実践入門』写経・実践会 in 横浜 #6 (特別編) #junitbook
『JUnit実践入門』写経・実践会 in 横浜 #6 (特別編) #junitbook
 
テスト駆動開発を継続する
テスト駆動開発を継続するテスト駆動開発を継続する
テスト駆動開発を継続する
 
地方における勉強会事情
地方における勉強会事情地方における勉強会事情
地方における勉強会事情
 
システム設計の謎 ~べ、別にあんたのために設計してるんじゃないんだからね///~
システム設計の謎 ~べ、別にあんたのために設計してるんじゃないんだからね///~システム設計の謎 ~べ、別にあんたのために設計してるんじゃないんだからね///~
システム設計の謎 ~べ、別にあんたのために設計してるんじゃないんだからね///~
 
失敗から学ぶAPI設計 #ccc_h4 #jjug #jjug_ccc JJUG CCC 2013 Spring
失敗から学ぶAPI設計  #ccc_h4 #jjug #jjug_ccc JJUG CCC 2013 Spring 失敗から学ぶAPI設計  #ccc_h4 #jjug #jjug_ccc JJUG CCC 2013 Spring
失敗から学ぶAPI設計 #ccc_h4 #jjug #jjug_ccc JJUG CCC 2013 Spring
 
Junitを使ったjavaのテスト入門
Junitを使ったjavaのテスト入門Junitを使ったjavaのテスト入門
Junitを使ったjavaのテスト入門
 
ユースケースからテスト駆動開発へ
ユースケースからテスト駆動開発へユースケースからテスト駆動開発へ
ユースケースからテスト駆動開発へ
 
静的解析のROI
静的解析のROI静的解析のROI
静的解析のROI
 
JUnitテストを1日やってみた
JUnitテストを1日やってみたJUnitテストを1日やってみた
JUnitテストを1日やってみた
 
第1回JUnit勉強会ハンズオン
第1回JUnit勉強会ハンズオン第1回JUnit勉強会ハンズオン
第1回JUnit勉強会ハンズオン
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
 
Spring integration概要
Spring integration概要Spring integration概要
Spring integration概要
 
Jenkins user conference 東京
Jenkins user conference 東京Jenkins user conference 東京
Jenkins user conference 東京
 
Jenkinsではじめる継続的インテグレーション
Jenkinsではじめる継続的インテグレーションJenkinsではじめる継続的インテグレーション
Jenkinsではじめる継続的インテグレーション
 
『JUnit実践入門』写経・実践会 in 横浜 #3
『JUnit実践入門』写経・実践会 in 横浜 #3『JUnit実践入門』写経・実践会 in 横浜 #3
『JUnit実践入門』写経・実践会 in 横浜 #3
 
Jenkinsを導入する本当の理由を考えてみた
Jenkinsを導入する本当の理由を考えてみたJenkinsを導入する本当の理由を考えてみた
Jenkinsを導入する本当の理由を考えてみた
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 

Similaire à R5 3 type annotation

JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)
JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)
JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)Yoshiharu Hashimoto
 
これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?Takahiro YAMADA
 
TDC20111031_Groovy_Geb
TDC20111031_Groovy_GebTDC20111031_Groovy_Geb
TDC20111031_Groovy_GebNobuhiro Sue
 
HeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LTHeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LTYuji Kubota
 
Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Yuji Kubota
 
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)a know
 
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireAkio Katayama
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情takezoe
 
Struts2を始めよう!
Struts2を始めよう!Struts2を始めよう!
Struts2を始めよう!Shinpei Ohtani
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略takezoe
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 
WebSocket+Akka(Remote)+Play 2.1 Java
WebSocket+Akka(Remote)+Play 2.1 JavaWebSocket+Akka(Remote)+Play 2.1 Java
WebSocket+Akka(Remote)+Play 2.1 JavaKazuhiro Hara
 
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」Hiroyuki Ohnaka
 
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのかJavaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのかYoshitaka Kawashima
 

Similaire à R5 3 type annotation (20)

JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)
JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)
JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)
 
Rx java x retrofit
Rx java x retrofitRx java x retrofit
Rx java x retrofit
 
これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?
 
TDC20111031_Groovy_Geb
TDC20111031_Groovy_GebTDC20111031_Groovy_Geb
TDC20111031_Groovy_Geb
 
HeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LTHeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LT
 
Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)
 
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
 
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情
 
Struts2を始めよう!
Struts2を始めよう!Struts2を始めよう!
Struts2を始めよう!
 
Ptt391
Ptt391Ptt391
Ptt391
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
WebSocket+Akka(Remote)+Play 2.1 Java
WebSocket+Akka(Remote)+Play 2.1 JavaWebSocket+Akka(Remote)+Play 2.1 Java
WebSocket+Akka(Remote)+Play 2.1 Java
 
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
 
120517 revert tomcat7
120517 revert tomcat7120517 revert tomcat7
120517 revert tomcat7
 
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのかJavaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
 
Backbone.js入門
Backbone.js入門Backbone.js入門
Backbone.js入門
 
Flex's DI Container
Flex's DI ContainerFlex's DI Container
Flex's DI Container
 
ScalaMatsuri 2016
ScalaMatsuri 2016ScalaMatsuri 2016
ScalaMatsuri 2016
 

R5 3 type annotation

  • 1. © 2013 EIICHI KIMURA. All Rights Reserved. 1 JJUG CCC 2013 Spring - [R5-3] #ccc_r53 Type Annotationって何 ? それを使うとプログラムはどう変わる ? 2013/5/11 木村英一(@kimuchi583) 2013/5/11 15:15-16:05
  • 2. 某メーカー/SIer で Java 技術支援や、新機能をいち早く普 及展開することに精力を注いでいます。ただ、イマイチ、新し いバージョンに移ってくれないのが悩みのタネ。Java との出会 いは v1.02 の頃。あれよ、あれよという間に 17年もってしまいま した。乗り鉄 & 撮り鉄。 WebSite(1) ー "Java etc..." - http://kimuchi583.at.webry.info/ WebSIte(2) ー http://blog.kimu2.jp/ Tweitter ー @kimuchi583 2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved. 2 木村って、どこのどいつ ?
  • 3. © 2013 EIICHI KIMURA. All Rights Reserved. 3 Annotationについて 2013/5/11 15:15-16:05
  • 5. Java8には82個のアノテーションが定義されている © 2013 EIICHI KIMURA. All Rights Reserved. 5 ANNOTATION_TYPE (アノテーション型) PACKAGE (パッケージ) TYPE (型・クラス) FIELD (フィールド) METHOD (メソッド) CONSTRUCTOR (コンストラクタ) PARAMETER (パラメータ) LOCAL_VARIABLE (ローカル変数) TYPE_PARAMETER (型パラメータ) TYPE_USE (型の利用) 型アノテーション 1 javax.xml.ws Action JAX-WS 2.1 〇 〇 〇 2 javax.xml.ws.soap Addressing JAX-WS 2.1 〇 〇 〇 〇 〇 3 javax.xml.ws BindingType JAX-WS 2.0 〇 〇 〇 4 java.beans ConstructorProperties Java SE 6 〇 〇 〇 5 java.lang Deprecated Java SE 5.0 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 6 javax.management DescriptorKey Java SE 6 〇 〇 〇 7 java.lang.annotation Documented Java SE 5.0 〇 〇 〇 8 javax.xml.ws FaultAction JAX-WS 2.1 〇 〇 〇 9 java.lang FunctionalInterface Java SE 8 〇 〇 〇 10 javax.annotation Generated Common Annotation 1.0 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 11 javax.tools.annotation GenerateNativeHeader Java SE 8 〇 〇 〇 12 javax.jws HandlerChain 〇 〇 〇 〇 13 java.lang.annotation Inherited Java SE 5.0 〇 〇 〇 14 javax.jws.soap InitParam 〇 15 javax.xml.ws.soap MTOM JAX-WS 2.1 〇 〇 〇 〇 〇 〇 16 javax.management MXBean Java SE 6 〇 〇 〇 17 java.lang.annotation Native Java SE 8 〇 〇 〇 18 javax.jws Oneway 〇 〇 19 java.lang Override Java SE 5.0 〇 〇 20 javax.annotation PostConstruct Common Annotation 1.0 〇 〇 〇 21 javax.annotation PreDestroy Common Annotation 1.0 〇 〇 〇 22 java.lang.annotation Repeatable Java SE 8 〇 〇 〇 23 javax.xml.ws RequestWrapper JAX-WS 2.0 〇 〇 〇 24 javax.annotation Resource Common Annotation 1.0 〇 〇 〇 〇 25 javax.annotation Resources Common Annotation 1.0 〇 〇 〇 26 javax.xml.ws RespectBinding JAX-WS 2.1 〇 〇 〇 〇 〇 〇 27 javax.xml.ws ResponseWrapper JAX-WS 2.0 〇 〇 〇 28 java.lang.annotation Retention Java SE 5.0 〇 〇 〇 29 java.lang SafeVarargs Java SE 7 〇 〇 〇 〇 30 javax.xml.ws ServiceMode JAX-WS 2.0 〇 〇 〇 〇 31 javax.jws.soap SOAPBinding 〇 〇 〇 32 javax.jws.soap SOAPMessageHandler 〇 33 javax.jws.soap SOAPMessageHandlers 〇 〇 〇 34 javax.annotation.processing SupportedAnnotationTypes Java SE 6 〇 〇 〇 35 javax.annotation.processing SupportedOptions Java SE 6 〇 〇 〇 36 javax.annotation.processing SupportedSourceVersion Java SE 6 〇 〇 〇 37 java.lang SuppressWarnings Java SE 5.0 〇 〇 〇 〇 〇 〇 〇 38 java.lang.annotation Target 〇 〇 〇 39 java.beans Transient Java SE 7 〇 〇 40 javax.xml.ws WebEndpoint JAX-WS 2.0 〇 〇 〇 41 javax.xml.ws WebFault JAX-WS 2.0 〇 〇 〇 42 javax.jws WebMethod 〇 〇 43 javax.jws WebParam 〇 〇 44 javax.jws WebResult 〇 〇 45 javax.jws WebService 〇 〇 46 javax.xml.ws WebServiceClient JAX-WS 2.0 〇 〇 〇 47 javax.xml.ws.spi WebServiceFeatureAnnotation JAX-WS 2.1 〇 〇 〇 48 javax.xml.ws WebServiceProvider JAX-WS 2.0 〇 〇 〇 49 javax.xml.ws WebServiceRef JAX-WS 2.0 〇 〇 〇 〇 〇 50 javax.xml.ws WebServiceRefs JAX-WS 2.0 〇 〇 〇 51 javax.xml.bind.annotation XmlAccessorOrder JAXB 2.0 〇 〇 〇 〇 52 javax.xml.bind.annotation XmlAccessorType JAXB 2.0 〇 〇 〇 〇 53 javax.xml.bind.annotation XmlAnyAttribute JAXB 2.0 〇 〇 〇 54 javax.xml.bind.annotation XmlAnyElement JAXB 2.0 〇 〇 〇 55 javax.xml.bind.annotation XmlAttachmentRef JAXB 2.0 〇 〇 〇 〇 56 javax.xml.bind.annotation XmlAttribute JAXB 2.0 〇 〇 〇 57 javax.xml.bind.annotation XmlElement JAXB 2.0 〇 〇 〇 〇 58 javax.xml.bind.annotation XmlElementDecl JAXB 2.0 〇 〇 59 javax.xml.bind.annotation XmlElementRef JAXB 2.0 〇 〇 〇 60 javax.xml.bind.annotation XmlElementRefs JAXB 2.0 〇 〇 〇 61 javax.xml.bind.annotation XmlElements JAXB 2.0 〇 〇 〇 62 javax.xml.bind.annotation XmlElementWrapper JAXB 2.0 〇 〇 〇 63 javax.xml.bind.annotation XmlEnum JAXB 2.0 〇 〇 64 javax.xml.bind.annotation XmlEnumValue JAXB 2.0 〇 〇 65 javax.xml.bind.annotation XmlID JAXB 2.0 〇 〇 〇 66 javax.xml.bind.annotation XmlIDREF JAXB 2.0 〇 〇 〇 67 javax.xml.bind.annotation XmlInlineBinaryData JAXB 2.0 〇 〇 〇 〇 68 javax.xml.bind.annotation.adapters XmlJavaTypeAdapter JAXB 2.0 〇 〇 〇 〇 〇 〇 69 javax.xml.bind.annotation.adapters XmlJavaTypeAdapters JAXB 2.0 〇 〇 70 javax.xml.bind.annotation XmlList JAXB 2.0 〇 〇 〇 〇 71 javax.xml.bind.annotation XmlMimeType JAXB 2.0 〇 〇 〇 〇 72 javax.xml.bind.annotation XmlMixed JAXB 2.0 〇 〇 〇 73 javax.xml.bind.annotation XmlNs JAXB 2.0 〇 74 javax.xml.bind.annotation XmlRegistry JAXB 2.0 〇 〇 75 javax.xml.bind.annotation XmlRootElement JAXB 2.0 〇 〇 76 javax.xml.bind.annotation XmlSchema JAXB 2.0 〇 〇 77 javax.xml.bind.annotation XmlSchemaType JAXB 2.0 〇 〇 〇 〇 78 javax.xml.bind.annotation XmlSchemaTypes JAXB 2.0 〇 〇 79 javax.xml.bind.annotation XmlSeeAlso JAXB 2.1 〇 〇 80 javax.xml.bind.annotation XmlTransient JAXB 2.0 〇 〇 〇 〇 81 javax.xml.bind.annotation XmlType JAXB 2.0 〇 〇 82 javax.xml.bind.annotation XmlValue JAXB 2.0 〇 〇 〇 @Deprecated @Documented @WebServiceFeatureAnnotation@Inherited Java SE 8~ 宣言アノテーション @Target @Retention Java SE 5.0 ~ # 導入バージョン RUNTIME SOURCE アノテーション型 パッケージ アノテーション名 2013/5/11 15:15-16:05
  • 6. これ以外に、JavaEEなど他のAPIでも使われています  Java EE 6 - Servlet, EJB  @EJB, @Stateless, @Stateful, @Singleton, ...  @WebServlet, @WebFilter, @WebListener, ...  CDI  @Model, @SessionScope, @Inject, ...  JPA  @Entity, @Table, @ID, @OneToMany, ... © 2013 EIICHI KIMURA. All Rights Reserved. 62013/5/11 15:15-16:05
  • 7. もちろん、自分でも作れます... アノテーション型 : Annotation Type public @interface Copyright { String value(); } © 2013 EIICHI KIMURA. All Rights Reserved. 72013/5/11 15:15-16:05
  • 8. JavaSE5~7で使えるアノテーション型のソース @Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { } @Target( // "ElementType." は省略してます ... { TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE }) @Retention(RetentionPolicy.SOURCE) public @interface SuppressWarnings { String[] value(); } © 2013 EIICHI KIMURA. All Rights Reserved. 82013/5/11 15:15-16:05
  • 9. アノテーションの利用例:Java8のソースから引用  String クラスの コンストラクタ @Deprecated public String(byte ascii[], int hibyte) { this(ascii, hibyte, 0, ascii.length); }  Interger クラスの hashCode メソッド @Override public int hashCode() { return Integer.hashCode(value); } © 2013 EIICHI KIMURA. All Rights Reserved. 92013/5/11 15:15-16:05
  • 10. 2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved. 10 TypeAnnotationについて
  • 11. アノテーション型 : Annotation Type と 型アノテーション : Type Annotation は違います !! © 2013 EIICHI KIMURA. All Rights Reserved. 112013/5/11 15:15-16:05
  • 12. アノテーション型には2種類あります  宣言アノテーション  @Target が ElementType.TYPE_USE 以外のアノテーション  ElementType.ANNOTATION_TYPE  ElementType.CONSTRUCTOR  ElementType.FIELD  ElementType.LOCAL_VARIABLE  ElementType.METHOD  ElementType.PACKAGE  ElementType.PARAMETER  ElementType.TYPE  ElementType.TYPE_PARAMETER : @since JDK8  型アノテーション  @Target が ElementType.TYPE_USE のアノテーション © 2013 EIICHI KIMURA. All Rights Reserved. 122013/5/11 15:15-16:05
  • 14. JavaSE8で型の使用に対しても記述できるようにする 型アノテーション  宣言に対してではなく、型の利用に対して利用できる。  たとえば、型限定子として、  メソッド仮引数、メソッド返却、レシーバの型の使用に対して  ジェネリックの型パラメータ、キャストでの型の利用に対して  (除) import 文、クラスリテラル(XXX.class)、static メンバアク セスのクラス名, アノテーション ⇒ これらは、型の使用とは解釈 されない。 © 2013 EIICHI KIMURA. All Rights Reserved. 142013/5/11 15:15-16:05
  • 15. 2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved. 15 言語仕様上は...
  • 17. 例1.クラス周りでは  コンストラクタ呼出し(オブジェクト生成)  new @Interned MyObject()  new @NonEmpty @Readonly List<String>(myNonEmptyStringSet)  myVar . new @Tainted NestedClass()  クラス継承  class UnmodifiableList<T> implements @Readonly List<@Readonly T> { ... } © 2013 EIICHI KIMURA. All Rights Reserved. 172013/5/11 15:15-16:05
  • 18. 例2.式・文まわりでは  throws 句  void monitorTemperature() throws @Critical TemperatureException { ... }  キャスト式  myString = (@NonNull String) myObject;  instanceof 式(型検査)  boolean isNonNull = myString instanceof @NonNull String; © 2013 EIICHI KIMURA. All Rights Reserved. 182013/5/11 15:15-16:05
  • 19. 例3.ジェネリック周りでは...  ジェネリッククラスの型アーギュメント  Map<@NonNull String, @NonEmpty List<@Readonly Document>> files;  ジェネリックメソッド・コンストラクタ呼出し時の型アーギュメ ント  o.<@NonNull String>m("...");  ジェネリックの型制約(bounds)  class Folder<F extends @Existing File> { ... }  Collection<? super @Existing File> © 2013 EIICHI KIMURA. All Rights Reserved. 192013/5/11 15:15-16:05
  • 20. 例4.配列周りでは... 指定場所で意味が変わる  @Readonly Doc[][] d1 = new @Readonly Doc [2][12]; // "read-only な Doc" の配列の配列  Doc @Readonly [][] d2 = new Doc @Readonly [2][12]; // Doc の配列の "read-only な配列"  Doc[] @Readonly [] d3 = new Doc[2] @Readonly [12]; // Doc の "read-only な配列" の配列 © 2013 EIICHI KIMURA. All Rights Reserved. 202013/5/11 15:15-16:05
  • 21. 例5.レシーバ用にメソッド引数宣言の構文が拡張!  インスタンスメソッドのレシーバ(this)  [通常のコード] は this を引数に書かない class MyClass { ... public String toString() { ... } public boolean equals(Object other) { ... } }  [レシーバに型アノテーションを指定する] ときは this 引数宣言する class MyClass { ... public String toString(@Readonly MyClass this) { ... } public boolean equals(@Readonly MyClass this, @Readonly Object other) { ... } } © 2013 EIICHI KIMURA. All Rights Reserved. 212013/5/11 15:15-16:05
  • 22. 例6.型利用でない場所-型アノテーションが書けず!!  アノテーション型に対するアノテーション  クラスリテラル Class c = @NonNull Integer.class; // NG Class c = Integer @NonNull[].class; // NG  import 文 import java.lang.@Interned String; // NG import @Interned java.lang.String; // NG  static メンバアクセス  @Interned String . valueOf(10); // NG © 2013 EIICHI KIMURA. All Rights Reserved. 222013/5/11 15:15-16:05
  • 23.  @NonNull  @Interned  @ReadOnly  @NotEmpty  @Critical  @Tainted  @Existing 使いたくなりましたか? 2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved. 23
  • 25. 型アノテーションの意味は規定しない さらに Java SE 8 で 事前定義された型アノテーションは (今のところ)ない !! 型アノテーションの提供側が、 その型アノテーションと、その意味との両方を与える。 © 2013 EIICHI KIMURA. All Rights Reserved. 252013/5/11 15:15-16:05
  • 26. 2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved. 26 CheckerFramework
  • 27. © 2013 EIICHI KIMURA. All Rights Reserved. 272013/5/11 15:15-16:05
  • 28.  v1.6.3 - 2013/5/1 版  http://types.cs.washington.edu/checker-framework/  Windows 版の起動方法  java -jar %CHECKERS%¥binary¥checkers.jar -processor checkers.nullness.NullnessChecker xxx.java  java は JDK6, JDK7 でも OK !! 2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved. 28 CheckerFramework
  • 29. 提供されるチェッカ 1. Nullness checker : ヌルポインターエラーチェック用 2. Interning checker : intern 化と等価検査エラーチェック用 3. Lock checker :並行処理とロック関連エラーチェック用 4. Fake enum checker : 型安全 enum パターンの許可向け 5. Tainting checker : 信頼性とセキュリティエラーチェック用 6. Regex checker : 構文不正の正規表現チェック用 7. Property file checker : プロパティ、リソースバンドル利用時の妥当にキーを使用しているかの チェック用(国際化含)。 8. Signature string checker : 型の文字列表現を適切に利用しているかのチェック用 (Class.forName()など)。 9. Units checker : 正しい計測単位で処理されているかのチェック用 10. Linear checker : 別名及び、再利用の制御向け 11. IGJ checker : 可変エラー(不正な副作用)向け(IGJ 型システム) 12. Javari checker : 可変エラー(不正な副作用)向け(Javari型システム) 13. Basic checker : カスタマイズ検査用 14. Typestate checker : オブジェクトの正しい状態で処理が行われているかのチェック用 15.その他 © 2013 EIICHI KIMURA. All Rights Reserved. 292013/5/11 15:15-16:05
  • 30. © 2013 EIICHI KIMURA. All Rights Reserved. 302013/5/11 15:15-16:05
  • 31. NullPointerException!!-従来は実行時エラー public class GetStarted1 { public static void main(String args[]) { new GetStarted1().sample(); } void sample() { Object o_ref = null; String s_ref = o_ref.toString(); } } > javac GetStarted1.java > java GetStarted1 Exception in thread "main" java.lang.NullPointerException at GetStarted1.sample(GetStarted1.java:9) at GetStarted1.main(GetStarted1.java:5) © 2013 EIICHI KIMURA. All Rights Reserved. 312013/5/11 15:15-16:05
  • 32. NullnessChecker- NonNullチェック(参照) import checkers.nullness.quals.*; public class GetStarted1 { // main()は割愛 void sample() { Object o_ref = null; String s_ref = o_ref.toString(); } } > java -jar %CHECKERS%¥binary¥checkers.jar -processor checkers.nullness.NullnessChecker GetStarted1.java GetStarted1.java:6: エラー: dereference of possibly-null reference ref String s_ref = o_ref.toString(); ^ エラー1個 © 2013 EIICHI KIMURA. All Rights Reserved. 322013/5/11 15:15-16:05
  • 33. NullnessChecker- NonNullチェック(代入) import checkers.nullness.quals.*; public class GetStarted1 { // main()は割愛 void sample() { @NonNull Object o_ref = null; String s_ref = o_ref.toString(); } } java -jar %CHECKERS%¥binary¥checkers.jar -processor checkers.nullness.NullnessChecker GetStarted1.java GetStarted1.java:5: エラー: incompatible types in assignment. @NonNull Object ref = null; ^ found : null required: @NonNull Object エラー1個 © 2013 EIICHI KIMURA. All Rights Reserved. 332013/5/11 15:15-16:05
  • 34. NullnessChecker- 冗長コードの指摘 import checkers.nullness.quals.*; public class GetStarted1 { // main()は割愛 void sample() { @NonNull String s_ref = "xxxx"; if(s_ref != null) System.out.println(s_ref); } } java -jar %CHECKERS%¥binary¥checkers.jar -Alint -processor checkers.nullness.NullnessChecker GetStarted1.java GetStarted1.java:9: 警告: redundant check; "ref" is non-null if (ref != null) { System.out.println(ref.toString()); } ^ 警告1個 © 2013 EIICHI KIMURA. All Rights Reserved. 342013/5/11 15:15-16:05
  • 35. NullnessChecker- 冗長コードの指摘 import checkers.nullness.quals.*; public class GetStarted1 { // main()は割愛 @Nullable String getXXXX() { return "xxxx"; } void sample() { @NonNull String s_ref = getXXXX(); } } java -jar %CHECKERS%¥binary¥checkers.jar -processor checkers.nullness.NullnessChecker GetStarted1.java GetStarted1.java:11: エラー: incompatible types in assignment. @NonNull String ref = getXXXX(); ^ found : @Nullable String required: @NonNull String エラー1個 © 2013 EIICHI KIMURA. All Rights Reserved. 352013/5/11 15:15-16:05
  • 36. NullnessChecker- 警告抑制 import checkers.nullness.quals.*; public class GetStarted1 { // main()は割愛 @Nullable String getXXXX() { return "xxxx"; } @SuppressWarnings("nullness") void sample() { @NonNull String s_ref = getXXXX(); } } java -jar %CHECKERS%¥binary¥checkers.jar -processor checkers.nullness.NullnessChecker GetStarted1.java © 2013 EIICHI KIMURA. All Rights Reserved. 362013/5/11 15:15-16:05
  • 37. © 2013 EIICHI KIMURA. All Rights Reserved. 372013/5/11 15:15-16:05
  • 38. InterningChecker import checkers.interning.quals.*; public class InternedTest { public static void main(String aegs[]) { @Interned String s1 = new @Interned String("aaa"); @Interned String s2 = new @Interned String("aaa"); String s3 = new String("aaa"); if(s1 == s2) { System.out.println("s1 == s2"); } if(s1 == s3) { System.out.println("s1 == s3"); } if(s2 == s3) { System.out.println("s2 == s3"); } if(s1.equals(s2)) { System.out.println("s1.equlas(s2)");} if(s1.equals(s3)) { System.out.println("s1.equlas(s3)"); } if(s2.equals(s3)) { System.out.println("s2.equlas(s3)"); } } } © 2013 EIICHI KIMURA. All Rights Reserved. 382013/5/11 15:15-16:05
  • 39. java -jar %CHECKERS%¥binary¥checkers.jar -processor checkers.interning.InternedChecker InternedTest.java InternedTest.java:10: エラー: attempting to use a non-@Interned comparison operand if(s1 == s3) { System.out.println("s1 == s3"); } ^ found: String InternedTest.java:11: エラー: attempting to use a non-@Interned comparison operand if(s2 == s3) { System.out.println("s2 == s3"); } ^ found: String InternedTest.java:12: 警告: use of .equals can be safely replaced by ==/!= if(s1.equals(s2)) { System.out.println("s1.equlas(s2)");} ^ エラー2個 警告1個 © 2013 EIICHI KIMURA. All Rights Reserved. 392013/5/11 15:15-16:05
  • 40. InterningChecker import checkers.interning.quals.*; public class InternedTest { public static void main(String aegs[]) { @Interned String s1 = new @Interned String("aaa"); @Interned String s2 = new @Interned String("aaa"); String s3 = new String("aaa"); if(s1 == s2) { System.out.println("s1 == s2"); } // if(s1 == s3) { System.out.println("s1 == s3"); } // if(s2 == s3) { System.out.println("s2 == s3"); } if(s1.equals(s2)) { System.out.println("s1.equlas(s2)");} if(s1.equals(s3)) { System.out.println("s1.equlas(s3)"); } if(s2.equals(s3)) { System.out.println("s2.equlas(s3)"); } } } © 2013 EIICHI KIMURA. All Rights Reserved. 402013/5/11 15:15-16:05
  • 41. エラー部分をコメントにして、実行してみると... >java InternedTest s1.equlas(s2) s1.equlas(s3) s2.equlas(s3) "s1 == s2" が表示さない !! @Interned 同士の "==" は false つまり、"s1 != s2" である。 実行時の結果保証まではしない !! © 2013 EIICHI KIMURA. All Rights Reserved. 412013/5/11 15:15-16:05
  • 42. InterningChecker import checkers.interning.quals.*; public class InternedTest { public static void main(String aegs[]) { @Interned String s1 = (new String("aaa")).intern(); @Interned String s2 = (new String("aaa")).intern(); String s3 = new String("aaa"); if(s1 == s2) { System.out.println("s1 == s2"); } // if(s1 == s3) { System.out.println("s1 == s3"); } // if(s2 == s3) { System.out.println("s2 == s3"); } if(s1.equals(s2)) { System.out.println("s1.equlas(s2)");} if(s1.equals(s3)) { System.out.println("s1.equlas(s3)"); } if(s2.equals(s3)) { System.out.println("s2.equlas(s3)"); } } } © 2013 EIICHI KIMURA. All Rights Reserved. 422013/5/11 15:15-16:05
  • 43. エラー部分をコメントにして、実行してみると... >java InternedTest s1 == s2 s1.equlas(s2) s1.equlas(s3) s2.equlas(s3) intern()を呼出すのはプログラマの責任 © 2013 EIICHI KIMURA. All Rights Reserved. 432013/5/11 15:15-16:05
  • 44. © 2013 EIICHI KIMURA. All Rights Reserved. 442013/5/11 15:15-16:05
  • 45. finalフィールドって、何がfinal - エラーになるのは ? public class ImmutableTest1 { static final int[][] iaa = new int[10][10]; static { for(int i = 0; i < 10; i++) { for(int j = 0; j < 10; j++) { iaa[i][j] = i*10 + j; } } } public static void main(String args[]) { iaa[0][0] = 100; // (1) iaa[1] = new int[10]; // (2) iaa = new int[10][10]; // (3) } } © 2013 EIICHI KIMURA. All Rights Reserved. 452013/5/11 15:15-16:05
  • 46. ImmutableTest1.java:14: エラー: final変数iaaに値を代入することはできません iaa = new int[10][10]; //(3) ^ エラー1個 © 2013 EIICHI KIMURA. All Rights Reserved. 46 iaa [0] [1] [2] [3] [9] [0] [0] [0] [1] [0] [2] [0] [3] [0] [9] [1] [0] [1] [1] [1] [2] [1] [3] [1] [9] [2] [0] [2] [1] [2] [2] [2] [3] [2] [9] [3] [0] [3] [1] [3] [2] [3] [3] [3] [9] [9] [0] [9] [1] [9] [2] [9] [3] [9] [9] : ... ... ... ... ... ... : : : : :: [0] [1] [2] [3] [9] [0] [0] [0] [1] [0] [2] [0] [3] [0] [9] [1] [0] [1] [1] [1] [2] [1] [3] [1] [9] [2] [0] [2] [1] [2] [2] [2] [3] [2] [9] [3] [0] [3] [1] [3] [2] [3] [3] [3] [9] [9] [0] [9] [1] [9] [2] [9] [3] [9] [9] : ... ... ... ... ... ... : : : : :: ここが final 2013/5/11 15:15-16:05
  • 47. では、要素を変更できないようにするには(1) public class ImmutableTest1 { static final int @ReadOnly[][] iaa = new int[10][10]; public static void main(String args[]) { iaa[0][0] = 100; // (1) iaa[1] = new int[10]; // (2) // iaa = new int[10][10]; // (3) } } ImmutableTest2.java:17: エラー: Cannot (re-)assign iaa through the reference: @IGJBottom int @ReadOnly [] @Mutable [] iaa[1] = new int[10]; // (2) ^ エラー1個 © 2013 EIICHI KIMURA. All Rights Reserved. 472013/5/11 15:15-16:05
  • 48. © 2013 EIICHI KIMURA. All Rights Reserved. 48 iaa [0] [1] [2] [3] [9] [0] [0] [0] [1] [0] [2] [0] [3] [0] [9] [1] [0] [1] [1] [1] [2] [1] [3] [1] [9] [2] [0] [2] [1] [2] [2] [2] [3] [2] [9] [3] [0] [3] [1] [3] [2] [3] [3] [3] [9] [9] [0] [9] [1] [9] [2] [9] [3] [9] [9] : ... ... ... ... ... ... : : : : :: [0] [1] [2] [3] [9] [0] [0] [0] [1] [0] [2] [0] [3] [0] [9] [1] [0] [1] [1] [1] [2] [1] [3] [1] [9] [2] [0] [2] [1] [2] [2] [2] [3] [2] [9] [3] [0] [3] [1] [3] [2] [3] [3] [3] [9] [9] [0] [9] [1] [9] [2] [9] [3] [9] [9] : ... ... ... ... ... ... : : : : :: ここが final ここが @ReadOnly 2013/5/11 15:15-16:05
  • 49. では、要素を変更できないようにするには(2) public class ImmutableTest1 { static final int @ReadOnly[] @ReadOnly[] iaa = new int[10][10]; public static void main(String args[]) { iaa[0][0] = 100; // (1) iaa[1] = new int[10]; // (2) // iaa = new int[10][10]; // (3) } } © 2013 EIICHI KIMURA. All Rights Reserved. 492013/5/11 15:15-16:05
  • 50. では、要素を変更できないようにするには ImmutableTest2.java:16: エラー: Cannot (re-)assign iaa through the reference: @IGJBottom int @ReadOnly [] iaa[0][0] = 100; // (1) ^ ImmutableTest2.java:17: エラー: Cannot (re-)assign iaa through the reference: @IGJBottom int @ReadOnly [] @ReadOnly [] iaa[1] = new int[10]; // (2) ^ エラー2個 © 2013 EIICHI KIMURA. All Rights Reserved. 502013/5/11 15:15-16:05
  • 51. © 2013 EIICHI KIMURA. All Rights Reserved. 51 iaa [0] [1] [2] [3] [9] [0] [0] [0] [1] [0] [2] [0] [3] [0] [9] [1] [0] [1] [1] [1] [2] [1] [3] [1] [9] [2] [0] [2] [1] [2] [2] [2] [3] [2] [9] [3] [0] [3] [1] [3] [2] [3] [3] [3] [9] [9] [0] [9] [1] [9] [2] [9] [3] [9] [9] : ... ... ... ... ... ... : : : : :: [0] [1] [2] [3] [9] [0] [0] [0] [1] [0] [2] [0] [3] [0] [9] [1] [0] [1] [1] [1] [2] [1] [3] [1] [9] [2] [0] [2] [1] [2] [2] [2] [3] [2] [9] [3] [0] [3] [1] [3] [2] [3] [3] [3] [9] [9] [0] [9] [1] [9] [2] [9] [3] [9] [9] : ... ... ... ... ... ... : : : : :: ここが final ここが @ReadOnly ここも @ReadOnly 2013/5/11 15:15-16:05
  • 52. @Immutablevs.@ReadOnly @Immutable はインスタンスの内容の変更ができない @ReadOnly は、その参照を通してのみ内容変更ができない。 © 2013 EIICHI KIMURA. All Rights Reserved. 522013/5/11 15:15-16:05 GregorianCalendar gc2 = new GregorianCalendar(); GregorianCalendar gc3 = new GregorianCalendar(); @Immutable GregorianCalendar im_gc1 = new @Immutable GregorianCalendar(); // OK @Immutable GregorianCalendar im_gc2 = gc2; // NG @ReadOnly GregorianCalendar ro_gc = gc3; // OK gc2.add(Calendar.DAY_OF_MONTH, 1); // OK gc3.add(Calendar.DAY_OF_MONTH, 1); // OK ro_gc.add(Calendar.DAY_OF_MONTH, 1); // NG
  • 53. 参照とデータ変更の関係図(前頁のコード) © 2013 EIICHI KIMURA. All Rights Reserved. 53 gc2 gc3 Gregorian Calendar Gregorian Calendar im_gc1 Gregorian Calendar @Immutable im_gc2 @Immutable @Immutable ro_gc @ReadOnly 参照 OK 変更 OK 参照 OK 変更 OK 参照 NG 変更 --- 参照 OK 変更 NG 参照 OK 変更 NG 2013/5/11 15:15-16:05
  • 54. 2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved. 54 無印(@Mutable) vs @ReadOnly vs. @Immutable g_cal Gregorian Calendar im_g_cal Gregorian Calendar @Immutable @Immutable ro_g_cal 参照 OK 変更 OK 参照 OK 変更 NG Gregorian Calendar @ReadOnly 参照 OK 変更 NG @ReadOnly 参照 OK 変更 NG 参照 OK 変更 NG
  • 55.  //*>>> import checkers.nullness.quals.*;*/ public class GetStarted1 { // main()は割愛 void sample() { /*@NonNull*/ Object o_ref = null; String s_ref = o_ref.toString(); } }  class MyClass { ... public String toString(/*>>> @Readonly MyClass this*/) { ... } public boolean equals(/*>>> @Readonly MyClass this, @Readonly*/ Object other) { ... } } CheckerFrameworkはJDK7でも使える 2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved. 55
  • 56. 2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved. 56 JavaSE8EarlyAccess
  • 57. JavaSE8EarlyAccess  Java SE 8 Early Access b89('13/5/9現在)  http://jdk8.java.net/download.html  Type Annotation を作れます  Type Annotation 構文を認識します  型アノテーションを記述していなくても this 引数をインスタンスメ ソッドの最初に引数に記述できる © 2013 EIICHI KIMURA. All Rights Reserved. 572013/5/11 15:15-16:05
  • 58.  型アノテーションは型の使用に対するアノテーション  実行時エラーになる前、コンパイル時にできるだけバグ の芽をつむために利用できる  ただ、JDK8 で標準的な型アノテーションはない  ツールなどで用意されているものをうまく活用しよう  Checker Framework は、その選択肢の一つ  ソースコードがごちゃごちゃする感も否めない  自分で型アノテーションを作ることもできる まとめ 2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved. 58
  • 59. 2013/5/11 15:15-16:05© 2013 EIICHI KIMURA. All Rights Reserved 59 おわり