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

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

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

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

Kotlin

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

Q&A

解決済

2回答

3998閲覧

Kotlin(Java?)でのArrayListへの要素の追加についての質問です

heroherotail

総合スコア17

Java

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

Kotlin

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

0グッド

1クリップ

投稿2017/02/08 06:27

編集2017/02/08 08:47

実行環境はKotlin ver1.0.6でJava8です
ArrayListを使い,要素の追加・取り出しを行いたいのですが
うまくいきません
for文の中でmodelをModelFactory#createModelから作成し,
ArrayListであるmodelsにaddしているのですが,新しく作成したmodelが
既に入っている要素を全て塗りつぶしてしまう結果となります.

以下が実装です

###ソースコード

Kotlin

1fun main(args: Array<String>){ 2 val models: ArrayList<Model> = ArrayList() 3 4 for (i in 0..4){ 5 val model = ModelFactory().createModel() 6 models.add(model) 7 for (m in models) 8 println("i,x,y = " + (i+1).toString() + "," + m.x.toString() + "," + m.y.toString()) 9 } 10 11 for (model in models) 12 println("x,y = " + model.x.toString() + "," + model.y.toString()) 13} 14

結果

i,x,y = 1,0.07473496472821772,0.30797528302849175 i,x,y = 2,0.6254996345471039,0.2674472108375042 i,x,y = 2,0.6254996345471039,0.2674472108375042 i,x,y = 3,0.927361187034477,0.8790114619475532 i,x,y = 3,0.927361187034477,0.8790114619475532 i,x,y = 3,0.927361187034477,0.8790114619475532 i,x,y = 4,0.32678477794185257,0.33446341578663796 i,x,y = 4,0.32678477794185257,0.33446341578663796 i,x,y = 4,0.32678477794185257,0.33446341578663796 i,x,y = 4,0.32678477794185257,0.33446341578663796 i,x,y = 5,0.1805648560841221,0.8108814141273503 i,x,y = 5,0.1805648560841221,0.8108814141273503 i,x,y = 5,0.1805648560841221,0.8108814141273503 i,x,y = 5,0.1805648560841221,0.8108814141273503 i,x,y = 5,0.1805648560841221,0.8108814141273503 x,y = 0.1805648560841221,0.8108814141273503 x,y = 0.1805648560841221,0.8108814141273503 x,y = 0.1805648560841221,0.8108814141273503 x,y = 0.1805648560841221,0.8108814141273503 x,y = 0.1805648560841221,0.8108814141273503

素人考えで直接的な関係はないと思いますが,実行に使ったクラスです

Kotlin

1class Model (var x: Double, var y: Double){ 2 companion object{ 3 val CREATOR = Model(0.0,0.0) 4 } 5}

Kotlin

1class Logic { 2 companion object{ 3 fun customize(model: Model): Model { 4 var random = Random() 5 model.x = random.nextDouble() 6 model.y = random.nextDouble() 7 return model 8 } 9 } 10}

Kotlin

1class ModelFactory { 2 fun createModel(): Model { 3 val model = Logic.customize(Model.CREATOR) 4 return model 5 } 6}

###アドバイスを受けて
Modelクラスを以下のように変更した結果,期待通りの動きを得ることが出来ました

Kotlin

1class Model (var x: Double, var y: Double)

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

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

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

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

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

guest

回答2

0

ベストアンサー

ArrayList関係なく、
ModelFactory().createModel()が返しているのが、結局のところ
Model.CREATORなので、
ModelFactory().createModel()で返ってくるのは全て同一のインスタンスになっています。

kotlin

1fun main(args: Array<String>){ 2 val model = ModelFactory().createModel() 3 4 model.x = 5.0 5 6 println(Model.CREATOR.x) // 5.0 7}

投稿2017/02/08 06:46

ozwk

総合スコア13512

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

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

heroherotail

2017/02/08 08:45

Singletonパターンの失敗例といった感じでしょうか… 該当箇所を削除し ```Kotlin class Model (var x: Double, var y: Double) ``` に変更したらうまく動きました ありがとうございます
guest

0

原因についてはozwkさんの回答で解決していますので(+1させていただきました)、修正方法について書いてみたいと思います。(Kotlin初心者なのでお手柔らかに)

質問者さんの改造版

kotlin

1class Model(var x: Double, var y: Double) { 2 companion object { 3 fun CREATOR(): Model = Model(0.0, 0.0) 4 } 5} 6 7val model = Logic.customize(Model.CREATOR())
もっとシンプル版

kotlin

1class Model(var x: Double = 0.0, var y: Double = 0.0) { 2} 3 4val model = Logic.customize(Model())

投稿2017/02/08 09:12

fuzzball

総合スコア16731

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問