質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

3回答

6572閲覧

valとvarのイニシャライザに対する仕様の違い

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2017/05/25 16:06

Kotlin

1var allByDefault: Int? // エラー:明示的なイニシャライザが必要 2val simple: Int? // エラーは出ない。コンストラクタ内で初期化が必要

valの場合はコンストラクタ内で初期化すればいいのに対して、
varの場合はコンストラクタ内での初期化ではいけないのですか?

ご存知のかた教えてください

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

kotlinはリファレンスをちょっと読んだだけであんまり自信は無いのですが、

リファレンスを読んだ感じでは、クラスのプロパティとしてのvarvalの違いは、

  • varはミュータブルでデフォルトのセッターとゲッターを持ち
  • valはイミュータブルでデフォルトのゲッターを持ち、セッターは認めない

で、どちらも明示的に初期化が必要
なので、val simple: Int?も初期化をしていないとエラーが出ます。

fun main(args: Array<String>) { class Test() { // どちらも『error: property must be initialized or be abstract』が出る var allByDefault: Int? // エラー val simple: Int? // エラー } }

どちらもプライマリコンストラクタで初期化が出来ます

kotlin

1fun main(args: Array<String>) { 2 class Test(num: Int) { 3 var allByDefault: Int? = num // OK 4 val simple: Int? = num // OK 5 } 6}

イニシャライザで初期化してもOK

kotlin

1fun main(args: Array<String>) { 2 class Test() { 3 var allByDefault: Int? 4 val simple: Int? 5 init { 6 allByDefault = 0 // OK 7 simple = 1 // OK 8 } 9 } 10}

ちなみに、val simple: Int? // エラーは出ない。コンストラクタ内で初期化が必要と記述されているサイトが見つけられなかったのですが、どこのサイトを参考にしたのでしょうか?

投稿2017/05/26 02:46

編集2017/05/26 02:48
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

0

ベストアンサー

IntelliJ IDEA Community Edition 2017.2でやってみました。(Kotlinを開発したJetBrain社のIDEです)

初期化についてはvalもvarも同じだと思います。どちらもコンストラクターや初期化ブロック内(init{})で初期化すればエラーにはなりませんでした。

Javaでは非finalなフィールドは値を初期化しなくても許されますが、Kotlinではそれは許さないようです。それはプロパティーをabstractと宣言できる言語仕様に起因すると思います。

abstractでないプロパティーは必ずプロパティーの宣言、コンストラクター、初期化ブロックのいずれかで値が与えられなければならない。一方abstractならそのいずれでも値を与えてはならない

そういう意味なのだろうと思います。シンプルです。


余談:

ところでprimary constructor(最も基本的なコンストラクター)を以下のように書けることをご存知と思います。

kotlin

1class A(var a: Int, val aNumber: Int) { 2 val doubleNumber = aNumber * 2 3 ... 4}

Scalaなんかでもそうですね。Javaから入るとちょっと戸惑いますが、このスタイルは合理的な気がします。なぜなら、インスタンスを作る際の(最も基本的なコンストラクションでの)パラメーターがクラス定義全体のスコープから見えるため、プロパティーの宣言と初期化を一々分離することなく単純に書けることが多いからです。

最初のころ、クラスの属性(フィールドあるいはプロパティ)がクラス宣言の本体の内側に同じインデント位置で並んでいるスタイルに慣れていたので、クラス宣言の場所に属性の一部が並ぶことに若干の違和感がありました。フィールドに対してJavaDocを丁寧に記述しているようなケースでは少々気持ち悪い感じにもなります。

Kotlin

1class A( 2 /** 3 * A variable for this class. 4 */ 5 var a: Int) { 6 /** 7 * A value for this class. 8 */ 9 val c: Int = 0 10 ... 11}

しかし、慣れてくるとインデントのずれによる少々の気持ち悪さよりも「名前や型の宣言とその値をすぐ近くに書けたり、冗長な書き方をせずに済む」ことの方が本質的に重要であると感じるようになりました。こうした点もKotlinがbetter javaたらんとする点の一つだと思います。

余程複雑な依存関係を持つプロパティーでない限りコンストラクターの中で書かなければならないケースはむしろ少ないと思います。そういう観点(どこがbetter javaなのか)の方を考えてみた方がよいのではないでしょうか?

投稿2017/05/26 03:37

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/05/28 20:50

モジュールの方にも、回答をくださりありがとうございます。 モジュールのinternalは、気を付けて使おうと思いました。 確かに、コンストラクターの中で書かなければいけないケースは、そんなにないですし、書かなければいけないのは初期化ブロックで扱った方がコードの可読性は上がると思います。kotlin慣れるまで時間がかかりそうです。 度々回答ありがとうございます!!
guest

0

うーん、エラー出ないけど‥。

kotlin

1class Hoge { 2 var allByDefault: Int? 3 constructor() { 4 allByDefault = 9999 5 } 6} 7 8println(Hoge().allByDefault) 9//=> 9999

投稿2017/05/26 02:12

編集2017/05/26 02:51
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/05/28 20:57

でないから、何言っているのか分からなかったのですよねー(笑) 回答ありがとうございました。 また、お願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問