class やメソッドの前に付ける修飾子のひとつで、
これによって修飾されたブロックでは、
すべての浮動小数点演算の途中結果の精度が、値の型に応じた精度に限定される。
ぎゃくにいうと、
非strictfpな式では、途中でオーバーフローするような計算でもただしく求まってしまうかもしれないというのが、仕様。
http://en.wikipedia.org/wiki/Strictfp
import java.util.*; public class A { public static void main(String[] args) { Set<Integer> s = new HashSet<Integer>() { { // instance initializer. System.out.println("constructed."); super.add(0); } @Override public boolean add(Integer x) { System.out.println("added " + x); return super.add(x); } }; s.add(1); s.add(11); System.out.println(s); } }
Note that an instance initializer is only called once for a class.
は間違いっぽい。
すべてのコンストラクタの先頭にコピーされると思えばいい
関数ポインタはない。
→ interface 経由で”関数”を持つクラスのシングルトンインスタンスを渡す。
リンクはしなくていい。
ただし、ライブラリを使うプログラムを実行するときに、
ライブラリがある場所にパスを通す必要がある。
java -cp lib:. Main
→ 少なくとも、. は CLASSPATH に入れておくべき
ArrayList は add しないとサイズが増えない。
→ 自動的に fill されることがない
generics は template ではない。
Map<K,V> で、
K.equals の引数は Object です。
コンパイル時に型情報は消されます。
Map の契約は要素型に equals(Object) 、 hashCode(void) メソッドの妥当な実装を要求する。
→ annotation
@Override public boolean equals(Object o){ ... }
<http://trove4j.sourceforge.net/>
via Collections : Programming : Java Products components (libraries, projects) Organized by topic
via odz buffer - Collection Library
<http://jakarta.apache.org/commons/sandbox/latka/>
HTTP server 用の test suite
<http://www.jdocs.com/>
いくつかの異なる Java ライブラリの API がまとめて置かれている。
ある機能を提供するライブラリを探す、というときに便利かも。
org.apache.commons.math.complex とかがある。
富豪的プログラマは
javax.swing.tree.TreeNodeのインターフェイスで、実装は DefaultMutableTreeNode を使うらしい。
JDK 5.0 の場合、
java -Dcom.sun.management.jmxremote
というオプションつきでプログラムを起動すると、
jconsole
からそのプログラムの使用メモリ量などの状態が見れる。
Java SE 6 Mustang じゃじゃ馬ならし Heap
<http://d.hatena.ne.jp/bellbind/20050903/p2>
Java で eval な javassist と、
クラス・メソッド・フィールドの修飾子をユーザー定義できる annotation を利用して、
副作用のないメソッド(値の変換のための関数)なら
いつも使える修飾子 @memorize を提供する。
泥臭い実装と、きれいなインターフェイスが実にJavaらしい。
List<List<String>> ll = new ArrayList<List<String>>();
というステートメントには、型が多すぎる。
public class ListFactory { public static<T> List<T> newInstance(T x, int ncopy) { return new ArrayList<T>(Collections.nCopies(ncopy, x)); } public static<T> List<T> newInstance() { return new ArrayList<T>(Collections.<T>emptyList()); } public static void main(String... args) { List<List<String>> ll = ListFactory.newInstance(ListFactory.newInstance("a", 2), 3); // ll.add(ListFactory.newInstance()); List<String> l = ListFactory.newInstance(); ll.add(l); System.out.println(ll); } }変数初期化のコンテキストが要求する型は完全な型だけれど、
ジェネリックメソッドの型推論を使う。
<http://www-06.ibm.com/jp/developerworks/java/060310/j_j-jtp02216.shtml?ca=drs->
public static <K,V> Map<K,V> newHashMap() {
return new HashMap<K,V>();
}
これを使えば、型パラメーターを2度入力することを安全に回避することができます。
Map<Socket, Future<String>> socketOwner = Util.newHashMap();