.NET系開発者から見たJava 
bleis-tift 
November 30, 2014
自己紹介 
id:bleis-tift / @bleis 
なごやではたらくゆるふわF#er 
Java のことは忘却のかなた・・・ 
Java 言語のことならそれなりに詳しい・・・ 
はず
Javaとの関わり
わたしとJava 
今すぐダウンロード 
2002 年~2003 年Java を始める(1.3~1.4) 
2003 年~ デザインパターン厨 
2007 年Sun Tech Days 2007 in Tokyo 
2009 年第一回名古屋Scala 勉強会
Java 1.4 
今見ると感慨深い新機能群 
assert 
正規表現ライブラリ 
例外のネスト
デザインパターン 
今考えると感慨深いデザインパターン 
Iterator 
Command 
Strategy 
それ言語に組み込まれてるよ/ それラムダ式でで 
きるよ
Sun Tech Days 2007 in Tokyo 
今思い出すと感慨深い発表内容 
ラムダ式 
JavaFX Script
名古屋Scala 勉強会 
このあたりからJava / C#からF#とかScala へ
.NET開発者から見た今のJava
ジェネリクス 
.NET にもあるけど、実装方法が違う(型 
消去) 
共通点としては、後付け 
うらやましいポイント 
高階型の実装とかの可能性がJava にはある 
.NET にはない
ダイアモンド構文 
C#ではvar、F#ではlet 
C#er「ださい」
ダイアモンド構文のだささ 
. 
Java のダイアモンド構文 
. 
.List<String> strs = new ArrayList<>(); 
. 
C#のvar . 
.var strs = new List<string>(); 
ださい
ダイアモンド構文の利点 
. 
C#のvar? . 
public class SomeClass 
{ 
. 
// コンパイルエラー・・・ 
var strs = new List<string>(); 
} 
C#のvar はフィールドに使えない 
. 
Java のダイアモンド構文 
. 
public class SomeClass { 
. 
// OK! 
List<String> strs = new ArrayList<>(); 
} 
まぁ、F#のlet はフィールドにも使えるんですけ 
どね!
インターフェイスのdefault 実装 
実装クラスで実装しなくてもいいメソッド 
劣化版拡張メソッド? 
リッチインターフェイスをシンインターフェ 
イスに変換できるのはうらやましいポイント
プリミティブ型 
int とかdouble とか 
効率のためというが・・・ 
これはJava の怠慢
プリミティブ型がオブジェクトとして扱えない 
のはJavaの怠慢 
. 
Java ではないコード 
. 
int x = 42; 
. 
String s = x.toString(); 
. 
こういうコードと等価とみなす 
. 
int x = 42; 
. 
String s = Integer.toString(x); 
まぁ、拡張メソッドですね
enum 
列挙型 
null が入る以外は、C#のenum より素敵 
まぁでも判別共用体の前では・・・ 
Java のenum もC#のenum も、ケースごとの値 
が持てない
ケースごとの値 
. 
アンケートを表す型的なもの(F#) 
. 
// 何で知りましたか?を表す型 
type t = 
. 
| NewsPaper 
| TV 
| Internet 
| Etc of string 
これをenum でやるのは無理
無名クラス 
その場(式) でインターフェイスを実装できる 
クラスの継承もできる 
.NET ではデリゲートで代用。でもたまに欲 
しくなる 
F#にはある
try-with-resouces構文 
スコープを抜けると自動でclose を呼ぶ仕組み 
それなんてusing 
F#はuse 束縛で更に良い感じに使える
use 束縛 
. 
F#の例 
. 
let f path = 
. 
use x = new StreamReader(path) 
// x を使って何か素敵なことをする 
// スコープを抜けるとx.Dispose が自動で呼び出される! 
. 
更に素敵な例 
. 
let f path = 
. 
// スコープは割と自由自在 
let body = 
use x = new StreamReader(path) 
x.ReadToEnd() 
// body を使って何か素敵なことをする
ラムダ式 
その場で関数が書ける機能 
C#のラムダ式と似ているが、F#のそれとは似 
ていない 
構文の話ではなく、型とかの話 
ラムダ式は特定の型を持つわけではない点 
ジェネリックとの統合が今一つな点
ラムダ式とジェネリック 
. 
F#の例 
. 
let f () = 
. 
// これができる 
let id = fun x -> x 
let a = id 42 
let b = id "hoge" 
()
.NET開発者から見た今後のJava
Value Types 
ユーザ定義できる値型 
それなんてstruct 
ただ、use cases を見ると・・・ 
Algebraic data: optional(no box), choice-of, 
unit(no bits) 
Tuples: multiple-value return!(requires specialized 
machinery also)
Specialization 
Value Types とかプリミティブ型もジェネリク 
スの型引数として渡したい 
.NET では普通にできている 
既存ライブラリとの互換性を考えると問 
題も・・・ 
Map.get() など、null を返すメソッドどうする 
よの? 
Conditional Methods を強力にすれば解決できそ 
うな気もするがはたして
おわり

.NET系開発者から見たJava