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

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

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

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

Q&A

3回答

731閲覧

引数の中身(値が変わっている)

riomakopa

総合スコア30

Java

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

0グッド

0クリップ

投稿2019/02/15 08:53

編集2019/02/15 09:34

メソッドの引数にaList, bListというものを追加して
returnで返ってきたあとに
再度、情報を構築しようとすると、引数の値が変わる理由がわからないです。
ConstrucTionListの引数では判定しているだけ、上書きしたりしていないので
何故このようになるのか教えていただきたいです。。

List<Model> aList = this.Service~ List<Model> bList = this.Service~ List<Bean> makeList = this.make(aList , bList);
private List<Bean> make( List<Model> aList, List<Model> bList ) { hogeList = this.ConstrucTionList(aList, bList); if ( CollectionUtils.isEmpty(bList)) { ~aListとbListを使って情報を構築する~    ※ここで情報構築するとaListの情報が変更されている }
■ConstrucTionList public List<Bean> ConstrucTionList( List<Model> aList, List<Model> bList) { List<Model> tmpList = new ArrayList<>(); ~aListとbListを使って情報を構築する~    for ( Model dt : aList) { dt.setA dt.setB dt.setC dt.setD dt.setE tmpList.add(dt); } for ( Model dt: bList) { dt.setA dt.setB dt.setC dt.setD dt.setE return tmpList ;

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

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

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

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

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

azuapricot

2019/02/15 08:56

圧倒的情報量の少なさなような
dice142

2019/02/15 09:02

「~…情報を構築する~」の中でメソッドの中身を書き換えるメソッドを使っているということはないですか?
riomakopa

2019/02/15 09:07

お伺いしたいことは、メソッドの中に入って かえってきたら 引数の値が変わることってあるのでしょうか?
riomakopa

2019/02/15 09:12

すみません。もう少し具体的に記入します
riomakopa

2019/02/15 09:20

更新いたしました。
guest

回答3

0

お伺いしたいことは、メソッドの中に入って

かえってきたら 引数の値が変わることってあるのでしょうか?

あります。
オブジェクトを渡した場合、呼び出したメソッドでその値が書き換えられれば、
呼び出し元でも書き換わってしまいます。

書き換えを防ぎたいのであれば、オブジェクトをコピーして渡すことになりますが、
基本的には表面だけのコピーになるので、注意が必要です。
(オブジェクトの中に更にオブジェクトがある場合は中のオブジェクトは参照のまま)

投稿2019/02/15 09:17

dice142

総合スコア5158

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

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

riomakopa

2019/02/15 09:39

ご回答ありがとうございます。 ただ、呼び出したメソッドではaListは判定で使っておりfor文で回して返却用の箱につめているので 書き換えをしているような所は見当たらないのですよね。 少し、調べましたがcloneメソッドを使って実装すれば 書き換えを防げるということでしょうか?
dice142

2019/02/15 09:48

> 書き換えをしているような所は見当たらないのですよね。 dt.setAなどは書き換えているわけではないのでしょうか? > cloneメソッドを使って実装すれば > 書き換えを防げるということでしょうか? 回答にも書いていますが、完全に防げるわけではないです。 cloneメソッドはシャローコピーなので、オブジェクト内部全部をコピーしてくれません。
riomakopa

2019/02/15 09:57

色々、教えていただきありがとうございます。 確かにsetしているところで情報は変わっているのです(ただaList自体は値は変わるはずないと思い込んでいました) 少しずつ理解できてきました。 情報を再構築する場合 makeメソッド内でもう一度 List<Model> aList = this.Service~で 情報を取ってきた方がベターな解決策でしょうか?
dice142

2019/02/15 10:04

> aList自体は値は変わるはずないと思い込んでいました aList自体が変わらなくてもaListが保持しているオブジェクトが変われば、結果は変わることに違いないです。 (ただしプリミティブ型は除く) > 情報を再構築する場合 > makeメソッド内でもう一度 > List<Model> aList = this.Service~で > 情報を取ってきた方がベターな解決策でしょうか? this.Service~がどういう取得しているのかわからないのでベターかどうかは不明です。 コードの規模や設計によって何がいいかは変わりますが、 とりあえず「ディープコピー」というキーワードで調べてみてください。
guest

0

内部で書き換えてない条件で書き換えられてるってことは
ウィルス感染の疑いがあるのでOSからクリーンインストールを試してください。

メモリがかってに書き換えられてる可能性があります。

そうでない場合はコードを公開してください。
参照渡しのデータを更新してる可能性が一番高いです

投稿2019/02/15 09:11

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

riomakopa

2019/02/15 09:40

ご回答ありがとうございます。 コードを公開致しました。
guest

0

値渡しと参照渡しに関するお話でしょうか。。。?
であれば以下記事を読んでみると良いかもしれません。
https://qiita.com/migi/items/3417c2de685c368faab1

また、動作の途中でSystem.out.println(aList)等を記述し、
どのタイミングで値が変わってしまったか確認すると良いかと思われます。

投稿2019/02/15 09:00

編集2019/02/15 09:03
reraNine

総合スコア124

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

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

dice142

2019/02/15 09:01

質問はJavaなのでconsole.log()ではなく、System.out.println()等ですね。
azuapricot

2019/02/15 09:01

JavaなのでSystem.out.print();では・・・・? Javaでもconsole.log()ってつかえるんですか(???)
azuapricot

2019/02/15 09:01

(そうですよねつかえませんよね安心しました)
reraNine

2019/02/15 09:03

ご指摘ありがとうございます。なんと初歩的なミスを...
riomakopa

2019/02/15 09:10

ご回答ありがとうございます。 言葉足らずでした。調べていくうちに、参照渡し・値渡しにいきつき デバックで一つずつ追いかけて変更された箇所までは特定出来たのですが これを防ぐためには、もう一度情報を詰めなおすしかないのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問