Somurie Engineer's Blog

今更ながらJava9の新機能をまとめてみた

背景 今までJava8の案件が主だったのですが、最近Java12の案件にも参画させて頂いています。 ただ、開発している中でJava9以降の機能を使っておらず、使える機能がないかを調べる目的でまとめてみました。 今回使用するサンプルコードは以下に全て置いてあります。 https://github.com/somurieengieer/javaSelfTraining/blob/master/src/sample/java9newFunc/Java9sample.java 追加された機能 BigInteger sqrt()の追加 BigIntegerで平方根取得のメソッドが追加されました。四捨五入するようで、√2は1を返します。 BigInteger bi1 = new BigInteger("9"); System.out.println(bi1.sqrt()); BigInteger bi2 = new BigInteger("2"); System.out.println(bi2.sqrt()); // sqrt()の返り値はBigIntegerのため、四捨五入されて1が返却される Optional、Stream ifPresentOrElse()の追加 Java8で追加されたOptional、Streamですが、Java9以降にいくつかメソッドが追加されているようです。Java8が展開された後に不足していた機能を充足するメソッド追加のようです。 ifPresentOrElse()ではOptionalの値が存在する場合としない場合の処理をまとめて記載することができます。 Optional<String opt1 = Optional.ofNullable("hoge"); opt1.ifPresentOrElse( s - System.out.println(s + " is exist"), () - System.out.println("not exist") ); Optional<String opt2 = Optional.ofNullable(null); opt2.ifPresentOrElse( s - System.out.println(s + " is exist"), () - System.out.println("not exist") ); streamNullFilter()の追加 Optionalのstream処理をする際に、値がnullの項目を排除することができます。 List<String searchList = new ArrayList<(){ { add("

動的型付言語と静的型付言語

背景 今までJavaの開発が多く、Javaは静的型付言語であった。最近Railsの開発に携わっており、静的型付言語と動的型付言語の違いを実感することがあったため雑ですが今思うことを以下に備忘メモとして残しました。 静的と動的型付言語の違い Rubyは動的型付言語であり、開発時にカルチャーショックを受けることが多い。 簡単な書き方であれば困ることはあまりないが、メタプログラミング要素を含む書き方になると調査難易度が格段に上がる。 現場で感じた動的型付言語のメリット・デメリットは以下の通り。 大規模になればなるほどメリデメは顕著に現れるように思える。現に現在参画している案件は大規模のため、以下の特徴を強く感じている。 静的型付言語のメリット (慣れると)開発生産性(メンテナンス性含む)は高い 静的型付言語のデメリット 慣れない間は遅い Ruby初学者 可読性が低い 静的コードチェックができないため、メソッド呼び出し可否が不明確 プロジェクト新規参入者の学習コストがかかる 影響範囲調査に時間がかかる(対応箇所の検討は付くが、裏取りに時間がかかる。CircleCIなど自動的に回帰テストを行える環境が整っていると良い) (雑な言い方だが)頭が良くないときつい。抽象的思考能力と大きめの脳内キャッシュ(短期記憶能力)があると良い プログラマの使い方を制限しないため空気を読んだコーディングが必須(コードレビューは必須) 最後に RubyはDDDと相性が良いように思える。 ドメインを明確に決めることで役割が明確化し、可読性、メンテナンス性が高まる。(デグレも起きにくい) Rubyの設計スキルを上げるためにDDDを学ぶ必要がある。 Railsの場合、ControllerとModelが確実に分割されるが、Modelが複雑化した時の書き方は追って学習する必要がある(ActiveRecord::Concernやmix-in、他にもある?) 大規模のプロジェクトでRails(動的型付言語)を使っている場合は序盤は全体構成の理解に徹するべき。 SOAによるサービス単位での分割など、大規模になりすぎないようにシステムを分割することを検討した方が良い。

Mac Mojave上へのJava11開発環境構築方法

はじめに Mac上にJava環境を整えたため、手順を残しておく。 環境 MacOS Mojave 10.14.1 Homebrew 1.9.3-14-g2cc5086 IntelliJ 2018.3.3 java se 11.0.2 作業日 2019/1/26 手順 homebrew-caskのインストール Homebrewはターミナルで使用するrbenvやnodebrewなどをインストールするパッケージマネージャですが、CaskではGUIアプリもインストールできます。 Caskをインストールするために以下コマンドを打ちます。 $ brew tap caskroom/cask IntelliJのインストール Caskを使用して、以下コマンドを実行します。(ceはコミュニケーションエディションです) $ brew cask install intellij-idea-ce Javaのインストール Caskを使用して、以下コマンドを実行します。自動的に最新版(2019/1/26時点ではjava11がインストールされます。 $ brew cask install java 参考までに、以下バージョンがインストールされました。 $ java -version openjdk version "11.0.2" 2019-01-15 OpenJDK Runtime Environment 18.9 (build 11.0.2+9) OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode) その他 以下コマンドでhomebrew-caskでインストールしたアプリケーションが一覧で確認できます。今回はIntelliJとjavaの2つをインストールしました。 $ brew cask list intellij-idea-ce java