Java クラスのオブジェクトは参照型なんでしたね...

じゃばじゃば、走るよ~、ジャバウォックさ~ん、というわけで、今回もJavaのお話です。

 

Javaのクラスのオブジェクトは参照型じゃったよね...

いや~、インスタンスの生成は処理が重いからっちゅう噂をネット情報で耳にしたような気がしていて、for文でやらかしてしまったんですよ!

な~に~!?やっちまったな!

teratail.com

⇧  C#で、同じ悩みを抱えていらっしゃった先輩方が!

 

で、私も同じような感じのことをしでかしてしまった訳です(涙)。

Eclipseで、適当に、Javaオブジェクトを作成し、クラスファイルも作成。

f:id:ts0818:20181212211420p:plain

で、ソースはこんな感じにしたんですよ。

/ListTest/src/entity/Member.java

package entity;

public class Member {

	private String name;
	private String from;

	public Member() {

	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getFrom() {
		return from;
	}
	public void setFrom(String from) {
		this.from = from;
	}
}

/ListTest/src/controller/ListTest.java

package controller;

import java.util.ArrayList;
import java.util.List;

import entity.Member;

public class ListTest {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		List<Member> members = new ArrayList<>();
		Member member = new Member();

		for(int index = 0; index < 10; index++) {

			member.setName(index + "号");
			member.setFrom(index + "より");
			System.out.println(member.getName());
			System.out.println(member.getFrom());
		    members.add(member);
		}

		for (Member m : members) {
			System.out.println(m.getName());
		}

	}

}

で、実行すると、

f:id:ts0818:20181212212028p:plain

すべて「9号」!

f:id:ts0818:20181212211942p:plain

 

正しくは、

package controller;

import java.util.ArrayList;
import java.util.List;

import entity.Member;

public class ListTest {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		List<Member> members = new ArrayList<>();

		for(int index = 0; index < 10; index++) {
		
			Member member = new Member();
		    
			member.setName(index + "号");
			member.setFrom(index + "より");
			System.out.println(member.getName());
			System.out.println(member.getFrom());
		    members.add(member);
		}

		for (Member m : members) {
			System.out.println(m.getName());
		}

	}

}

こうでした...

f:id:ts0818:20181212212304p:plain

1つしかインスタンスを作成しないと、Listにaddしてるインスタンスは、すべて同一のインスタンスなので、最終的な値(今回は、9)でaddしてたインスタンスが更新されてしまうってことですね...。

■1つのインスタンス(Memberオブジェクト)しか生成しなかったときのイメージ図

f:id:ts0818:20181212224306p:plain⇧ リストの中身のすべてが、最終的に「9」になってしまうと...。

 

10万回とかの繰り返しで、10万個オブジェクト生成とかやったら、JVMのメモリとか足りなくなって落ちたりしないのかな?

 

今宵も、ウッカリ八兵衛的なミスをやらかしてしまった...

皆様もお気をつけあれ~。

今回はこのへんで。