読書会(Kotlinイン・アクション)第2回議事録

[ 戻る ]


======================================================
Java読書会BOF「Kotlin イン・アクション」を読む会 第2回
======================================================

.. csv-table:: 開催概要

"日時", "2018年2月17日 10:00 - 17:00"
"場所", "川崎市教育文化会館 第3会議室"
"出席者(敬称略)","高橋(徹)、岩室、遠藤、井上、山田、平山、吉本、今井、加藤、石黒"

第2章 Kotlin の基本
===================

2.4 繰り返しの処理: while と for のループ
-----------------------------------------

本日は、p.48 の 2.4.3 から

2.4.3 マップの繰り返し処理
~~~~~~~~~~~~~~~~~~~~~~~~~~

* リスト 2.24: ``new`` キーワード思わず書いてしまいそうだ

* そういえば最新の C++ の言語仕様は変だよね...
* VB ほどでは...

* 複数変数への同時代入できるんだ

* 3.4.3 の分解宣言か

2.4.4 コレクションやレンジの一員であることを調べるために in を使用する
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2.5 Kotlin における例外処理
---------------------------

* ``throw`` が式であるので代入するような構文も書ける (コンパイルできる) が、そのパスの場合は代入されない
* ``do`` と ``do-while`` 以外はほとんど式でできている (p.24 のコラム)
* 代入も文
* ``while`` 内の代入+判定みたいなことは書かない
* そもそも最近 ``for`` や ``while`` を直接書く機会減っている、DB の ``ResultSet`` 読むときぐらいかな

2.5.1 try、catch、finally
~~~~~~~~~~~~~~~~~~~~~~~~~

* リスト2.27: Java の ``Properties`` の ``close()`` 忘れとか思い出す...

2.5.2 式としての try
~~~~~~~~~~~~~~~~~~~~

2.6 まとめ
~~~~~~~~~~

第3章 関数の定義と呼び出し
==========================

3.1 Kotlin におけるコレクションの生成
-------------------------------------

* Java の Collection をそのまま使うということは言語的に Immutable な Collection などはない?

* ``kotlin.collections`` 定義の型もあり、こちらは Immutable / Mutable が区別されているようだが、その場合の Java との相互運用性はどうなるか

3.2 関数呼び出しを簡単にする
----------------------------

* 文字列 join、Java にも ``String.join`` ある (ただし 1.8 から)
* リスト3.1: ``return`` 省略できるのは 1 行のときだけ

3.2.1 名前付き引数
~~~~~~~~~~~~~~~~~~

* IntelliJ は引数名を表示する機能があり、もちろんオフにもできる
* 接尾語は ``postfix`` なの ``suffix`` なの
* Kotlin では引数名で引数を指定できるため、引数名まで API に含まれてしまう

3.2.2 デフォルト引数
~~~~~~~~~~~~~~~~~~~~

* Java ではあえて可変長引数を使わずにオーバーロード並べる例がある (log4j など)

* パフォーマンスだったり、古い Java との互換性だったり

* 【誤植】P63 一番下のコードリスト: ``suffix`` とあるが、これまでの引数名は ``postfix`` で定義されている

* 原著の誤植らしい、フォーラムに挙がっていた: https://forums.manning.com/posts/list/40143.page;jsessionid=12C1E88AA5148C85A2CECA7246AFE838

3.2.3 静的なユーティリティクラスをなくす: トップレベルの関数とプロパティ
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* Java のライブラリだとみんな ``StringUtil`` (``StringUtils``) とか作るよね...

* 標準ライブラリだと複数形にしたクラス名でユーティリティメソッドを並べるパターンが多い

* ``const val`` って気持ち悪い

* ``const`` つけておくと Java 上で定数になるだけ・・・実に気持ち悪い

3.3 他人のクラスにメソッドを追加する: 拡張関数と拡張プロパティ
--------------------------------------------------------------

* 拡張関数、C# のそれとよく似ている
* 拡張関数書いた後に本体に同じものが追加されたらコンパイルエラーか?

* メンバ関数が優先される (P74 参照)

* コンパイル済の拡張関数と組み合わせた場合はどうか?

* この場合は (再コンパイルされるまでは) 拡張関数が呼ばれる (P74 参照)

3.3.1 インポートと拡張関数
~~~~~~~~~~~~~~~~~~~~~~~~~~

3.3.2 拡張関数を Java から呼び出す
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

3.3.3 拡張としてのユーティリティ関数
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* 「構文糖衣」は syntax sugar のこと?訳に違和感がある

* 「糖衣構文」のほうが Wikipedia に記事もあるし馴染みがある
* より直訳調に「構文糖」ともいう

3.3.4 拡張関数をオーバーライドできない
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* ``open`` は拡張可能にするキーワード (Kotlin ではデフォルトで ``final``, P93 参照)
* メンバ関数と拡張関数が衝突してもコンパイルエラーにはならないところが怖い

3.3.5 拡張プロパティ
~~~~~~~~~~~~~~~~~~~~

* Java 屋からするとプロパティはコードから挙動が読みづらくなる不安がある

* C# 屋からすると逆にメソッドのほうが気持ち悪いのかも
* Java の配列の ``length`` とかはプロパティに近い感覚はある

3.4 コレクションを扱う: 可変長引数、中置呼び出し、ライブラリのサポート
----------------------------------------------------------------------

3.4.1 Java のコレクション API の拡張
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

3.4.2 可変長引数: 任意の数の引数を取る関数
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* スプレッド演算子 (*)、他の言語だと Ruby ぐらい?

* 演算子ではないものはあるが・・・

3.4.3 ペアを扱う: 中置呼び出しと分解宣言
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* ``mapOf`` に ``key`` が同じ ``Pair`` を複数入れたらどうなるか?

* 内部的にループで ``put()`` していたら後勝ちのような気がするが...

* この ``infix`` で ``null`` は入るのか?

* 入ったぞ...
* ``Pair`` の型推論か?
* ``Any`` は Kotlin 言語上の概念、Java では ``Object`` にコンパイルされる (P207 参照)

3.5 文字列と正規表現を扱う
--------------------------

3.5.1 文字列の分割
~~~~~~~~~~~~~~~~~~

3.5.2 正規表現とトリプルクオート文字列
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* リスト3.9: この本は adoc (Asciidoc) で書かれているのだろうか

* Asciidoc は最近 Spring のドキュメントなどあちこちで採用例がある

* トリプルクオート内にトリプルクオート文字列を入れたい場合は?

* エスケープ手段がない、諦めよう


3.5.3 複数行のトリプルクオート文字列
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* 【誤植】P64 第1段落: ``\\`` 版と ``\`` 版が逆

* 公式のサポートページに掲載されている: https://book.mynavi.jp/supportsite/detail/9784839961749.html
* このページ、書籍ページからのリンクがなくて見つけづらい...

3.6 コードを整理する: ローカル関数と拡張
----------------------------------------

3.7 まとめ
----------

第4章 クラス、オブジェクト、インターフェイス
============================================

* 「ネストされたクラスは、デフォルトでは内部クラスではありません」ということは、 Java でいうと ``static`` がつくネストしたクラス

4.1 クラス階層の定義
--------------------

4.1.1 Kotlin のインターフェイス
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

4.1.2 open、final、abstract 修飾子: デフォルトは final
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* Effective Java は第3版の洋書が先月発売、和訳は進行中

4.1.3 可視性修飾子: デフォルトは public
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

本日は、 p.98 の 4.1.4 の前まで


[ 戻る ]