2017年12月31日日曜日

Java : interfaceのprivateメソッド

Java9からinterfaceにprivateメソッドを記述することができるようになった。



privateメソッドのため子クラスから参照することは出来ない。interfaceに実装したdefaultメソッドやstaticメソッドすることを想定した機能だと思う。使うときにはこのように実装する。普通に継承すればいいだけ。



abstractクラスとinterfaceの違いがなくなってしまったような気がする。

違いとして考えられるのはinterfaceはいくらメソッドを書けるといってもinterfaceなので、いくつでもimplementsすることが出来る。



つまりinterfaceだとabstractとは異なり多重継承のようなことが出来てしまう。これはdefaultメソッドを使えるようになったJava8のときから出来る。Java9になってprivateメソッドも実装できるようになったのでこの機能がより強化された形になったと思う。

多重継承というとあまりいいイメージがない。C++で開発を行うときにも内部的な規約で禁止していたりと、何かと嫌われている感じがする。ただ、うまくやればより柔軟な設計が可能になるわけで、使う、使わないの選択はプログラマが行うほうがいいと思う。

2017年12月30日土曜日

Java : List / Map / Set のファクトリメソッド

Java9から List / Map / Set にファクトリメソッドが追加されている。

Java8までだと、Listを使うにはインスタンスを作成し、その後に add する必要があった。


これがJava9になると、このように書くことができるようになった。



このコードはJava8だとコンパイルエラーになってしまう。

Listなどのコレクションクラスを使う場合にいちいち実装クラス(ArrayListやLinkedList)を指定してやらないといけないところが面倒だと感じていたので、この面倒さが解消されるのが嬉しい。Listの使用方法によって、実装クラスを使い分けたほうが速度面で優位なのかもしれないけれど、そこまでシビアに処理能力の差を求められることも少ないんじゃないだろうか。もちろん、作っているプログラムによるわけだけれど。

空のListを作りたい場合は、「List list = List.of();」とする。



Setでも同様にコードを書くことができる。



Setは要素の重複が許されないので、下記のように書いてしまうと実行時にIllegalArgumentExceptionが発生してしまうので注意が必要となる。



最後にMapも試してみる。



Mapでは「Key1, Value1, Key2, Value2 ・・・・」というようにKeyとValueを繰り返し書いていくことになる。注意しないといけないのは、Mapの場合は10個までしか指定できないこと。なので、下記のように書くとコンパイルエラーとなる。



11個以上指定する場合は Map.ofEntries メソッドを使う。



2017年12月27日水曜日

Java : JShell

Java9から導入されたJavaのREPL環境であるJShellで少し遊んでみたので、やったことをまとめておく。以下、動作環境はWindows8.1、Windows PowerShell。

まず、JShellのディレクトリだが、JDKインストールフォルダ配下のbinディレクトリ。私の環境だと「C:\Program Files\java\jdk-9.0.1\bin」となっている。


JShell上でプログラムを実行してみる。


変数も使える。作った変数は /vars とコマンドを打つと確認できる。


メソッドの作り方。1行でも書くことはできるが、行の途中で改行するとJShellの方で勝手に判断してくれる。作ったメソッドは /methods とコマンドを打つと確認できる。


クラスも作ったりできるのだけれど、書くのが大変なのでこの辺りで・・・。ちなみに、/help とコマンドを打つとヘルプを見られる。


ヘルプの全文は以下の通り。色々な機能を持っていることが分かる。

|  Java言語の式、文または宣言を入力します。
|  または、次のコマンドのいずれかを入力します:
|  /list [<name or id>|-all|-start]
|       入力したソースをリストします
|  /edit <name or id>
|       名前またはIDで参照されるソース・エントリを編集します
|  /drop <name or id>
|       名前またはIDで参照されるソース・エントリを削除します
|  /save [-all|-history|-start] <file>
|       ファイルにスニペット・ソースを保存します。
|  /open <file>
|       ソースの入力としてファイルを開きます
|  /vars [<name or id>|-all|-start]
|       宣言された変数およびその値をリストします
|  /methods [<name or id>|-all|-start]
|       宣言されたメソッドおよびその署名をリストします
|  /types [<name or id>|-all|-start]
|       宣言された型をリストします
|  /imports
|       インポートされたアイテムをリストします
|  /exit
|       exit jshell
|  /env [-class-path <path>] [-module-path <path>] [-add-modules <modules>] ...
|       評価コンテキストを表示または変更します
|  /reset [-class-path <path>] [-module-path <path>] [-add-modules <modules>]...
|       reset jshell
|  /reload [-restore] [-quiet] [-class-path <path>] [-module-path <path>]...
|       リセットして関連する履歴をリプレイします -- 現在または以前(-restore)
|  /history
|       入力した内容の履歴
|  /help [<command>|<subject>]
|       jshellに関する情報を取得します
|  /set editor|start|feedback|mode|prompt|truncation|format ...
|       jshell構成情報を設定します
|  /? [<command>|<subject>]
|       jshellに関する情報を取得します
|  /!
|       最後のスニペットを再実行します
|  /<id>
|       IDでスニペットを再実行します
|  /-<n>
|       n回前のスニペットを再実行します
|
|  詳細は、'/help'の後にコマンドまたはサブジェクトの名前を続けて
|  入力してください。
|  たとえば、'/help /list'または'/help intro'などです。サブジェクト:
|
|  intro
|       jshellツールの概要
|  shortcuts
|       スニペットおよびコマンドの補完、情報アクセス、および自動コード生成
|       のキーストロークの説明
|  context
|       /env /reloadおよび/resetの評価コンテキスト・オプション



以前、同僚がJShellを作る意味(存在意義)が分からないと言っていたのだけれど、ちょっと動作を確認したいときなどには便利。今まではクラスをいちいち作成してなど、ちょっと面倒だった。

APIを呼び出して結果を得ることも簡単にできる。手軽に試せるのが何よりの利点だろうと思った。

また、これからJavaを学習する人にとっては、クラスやなんだといちいち書かなくていいので、学習の敷居も下げてくれるものだと思う。RubyやPythonなどにはREPL環境があるわけで、ある環境とない環境のどちらを使いたいかと言われれば、断然ある環境なわけだし、他の言語に対抗するうえでも必要なものなんじゃないだろうか。

2017年12月17日日曜日

Java : MapとList を使ってJSONを作成するクラス

JavaでMapとListを使ってJSON文字列を返却するクラスを作成した。Jackson等のライブラリを使えば楽なのかもしれないけれど、仕事によっては外部ライブラリを自由に使うことができなかったりすることもあるので、そうしたときには使えると思う。

ソース


使用例



出力結果


ちょっと使いづらい気もするけれど実用に耐え無いわけじゃないし、これで良しとしておこう。

2017年12月1日金曜日

jQuery : Ajaxの基本的なやり方

Ajaxをうまく使えば、ブラウザアプリであっても操作性の優れたアプリを作ることが出来る。サブミットしなくてもサーバと通信が出来るだけで、UIの幅がかなり広がる。この記事では、jQueryを用いたAjaxの基本的なやり方を説明していく。

Ajaxプログラム


上記のプログラムはAjaxを利用してサーバと通信を行うことができる。

  • url : 通信を行うURLを指定する
  • type : POSTかGETを指定する
  • data : リクエストパラメータの指定を行う。key : value の組み合わせで指定を行い、カンマ区切りで複数が指定できる
  • timeout : タイムアウトまでの時間をミリ秒で指定する
  • beforeSend : サーバと通信を行う前に行う処理を記述する
  • done : サーバとの通信が成功したときの処理を記述する
  • fail : サーバとの通信が失敗したときの処理を記述する
  • always : サーバとの通信の成否に関わらず行う処理を記述する


Ajaxによる処理は非同期処理となるので、そこはプログラム設計をするときに考慮にいれる必要があるが、asyncというプロパティもありこれのtrue/falseを切り替えることで同期処理とすることも可能だ。

  • async : true  ->  非同期処理
  • async : false  ->  同期処理


同期処理を行うAjaxプログラム