忍者ブログ
よくわからないことを調べて解説してみるブログ。

2024

0521
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2015

0527
まとめ
・Enumクラスは抽象クラスである。
・EnumクラスはComparableを実装している。
・Enumクラスはequalsをfinal実装している。
・列挙型はEnumクラスを実装している。
・列挙型における列挙値は列挙型の実装である。
・Enumクラスでは、ordinalと呼ばれる順序付け変数を持っており、
 列挙値のデフォルトコンストラクタの引数で与えられる。
 この引数は、列挙型における列挙値の定義順と同値。
・列挙型は、インタフェースを実装することが出来る。
・列挙型は、new によるインスタンス化はできない。
・列挙型は、メソッドを定義出来る。呼び出し方法は、列挙値.メソッド名。
・列挙型は、抽象メソッドを定義出来る。列挙値ブロックで@Overrideを実装必須。
・列挙型は、内部にインタフェースを定義することが出来る。

併せて読みたい生かし方
[Java] enum basics
[Java] enumをもうちょっと使う
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;

public class EunmMethod {
	public static void main(String[] args) {
		System.out.println(Arrays.asList(AttackType.values()));
		System.out.println(AttackType.valueOf("PANCH"));

		System.out.println("----------------------------------------------");
		// インタフェースへのポリモフィズムは有効
		List list = new ArrayList();
		list.add(AttackType.THROW);
		list.add(AttackType.PANCH);
		list.add(AttackType.KICK);

//		Collections.sort(list);// コンパイルエラー。擬態の結果、Enumに実装されていたComparableは未実装扱いに。当然といえば、当然か。

		for (AttackTypeInterface superAttackType : list) {
			System.out.println(superAttackType);
		}

		System.out.println("----------------------------------------------");
		List list2 = new ArrayList();
		list2.add(AttackType.THROW);
		list2.add(AttackType.PANCH);
		list2.add(AttackType.KICK);

		Collections.sort(list2); // ENUM実装クラスにおける列挙順にソートする。Enumに実装されているComparable#compareToによる。

		for (AttackTypeInterface superAttackType : list2) {
			System.out.println(superAttackType + ", ordinal = " + ((AttackType)superAttackType).ordinal()); //順番の表示
		}

		System.out.println("----------------------------------------------");
		EnumSet enumSet = EnumSet.allOf(AttackType.class); // Enum実装クラスの集合生成
//		EnumSet enumIfSet = EnumSet.allOf(AttackTypeInterface.class);
		// 上記は、シグネチャ違反になりコンパイルエラー。public static > EnumSet allOf(Class elementType)

		for (AttackType attackType : enumSet) {
			System.out.println(attackType);
		}
	}
}

interface AttackTypeInterface {
	void allCheck();
}

enum AttackType implements AttackTypeInterface {
	PANCH, KICK, THROW, ;

	@Override
	public void allCheck() {
		for (AttackType element : Arrays.asList(AttackType.values())) {
			System.out.println(this == element);
		}
	}
	// equals はオーバーライドできない。Enum型のfinalメソッドとなっている。

	@Override
	public String toString() {
		return super.toString();
	}
}

実行結果
[PANCH, KICK, THROW]
PANCH
----------------------------------------------
THROW
PANCH
KICK
----------------------------------------------
PANCH, ordinal = 0
KICK, ordinal = 1
THROW, ordinal = 2
----------------------------------------------
PANCH
KICK
THROW

拍手[0回]

PR

2015

0524
  • あるオブジェクト同士のequalsメソッドがtrueを返すとき、それぞれのオブジェクトのhashCodeは同一の値を返却しなくてはならない。
  • ある2つのオブジェクトのhashCodeが不一致であるとき、そのオブジェクト同士によるequalsメソッドはfalseを返却しなくてはならない。
  • ある2つのオブジェクト同士のequalsメソッドがfalseを返すとき、それぞれのオブジェクトはtrue,falseのいずれの値を返却しても良い。
  • hashCodeは、同一のオブジェクトであるかぎり、同一の値を返さなくてはならない。
例1
import java.util.HashSet;

public class EqualsHashCodeError1 {
	public static void main(String[] args) {
		Unit unit1 = new EqualsHashCodeError1().new Unit(1);
		Unit unit2 = new EqualsHashCodeError1().new Unit(2);

		HashSet set = new HashSet();
		set.add(unit1);
		set.add(unit2);

		System.out.println("unit1 hash = " + unit1.hashCode() + ", set contains unit1 = " + set.contains(unit1));
		System.out.println("unit2 hash = " + unit2.hashCode() + ", set contains unit2 = " + set.contains(unit2));
	}
class Unit {
		int id;

		public Unit(int id) {
			this.id = id;
		}

		@Override
		public int hashCode() {
			return id++;// hashCodeはいかなる状況でも同じ値を返すこと。
		}

		@Override
		public boolean equals(Object obj) {
			return this.id == ((Unit) obj).id;
		}
	}
}
実行結果
unit1 hash = 2, set contains unit1 = false
unit2 hash = 3, set contains unit2 = false

例2

import java.util.Hashtable;

public class EqualsHashCodeError2 {
	public static void main(String[] args) {
		Unit unit1 = new EqualsHashCodeError2().new Unit(1);
		Unit unit2 = new EqualsHashCodeError2().new Unit(2);

		Hashtable<Integer, Unit> map = new Hashtable<Integer, EqualsHashCodeError2.Unit>();

		for (int i = 0; i < 1000; i++) {
			map.put(i, new EqualsHashCodeError2().new Unit(i));
		}

		System.out.println("unit1 hash = " + unit1.hashCode()	+ ", set contains unit1 = " + map.containsValue(unit1));
		System.out.println("unit2 hash = " + unit2.hashCode()	+ ", set contains unit2 = " + map.containsValue(unit2));
		System.out.println("unit1 hash = " + unit1.hashCode()	+ ", set contains unit1 = " + map.containsValue(unit1));
	}

	class Unit {
		int id;
		boolean equals;

		public Unit(int id) {
			this.id = id;
		}

		@Override
		public int hashCode() {
			return id;// hashCodeはいかなる状況でも同じ値を返すこと。
		}

		@Override
		public boolean equals(Object obj) {
			if (this.id == ((Unit) obj).id) {
				this.id = (int) Math.random() * 100;
				return true; // equalsがtrueを返すとき、hashCodeは同じ値となる。
			}
			return false;
		}
	}
}


実行結果
unit1 hash = 1, set contains unit1 = true
unit2 hash = 2, set contains unit2 = true
unit1 hash = 1, set contains unit1 = false

拍手[0回]

2015

0524
リテラル数値を宣言する際に、
0bを振ることで、2進数の表現が可能。
0xを振ることで、ヘキサ(16進数)での表現が可能。
当然、数値同士なので和を求めることも可能。
アンダースコアには、区切り文字の意味。

public class BinaryValue {
 public static void main(String[] args) {
 int a = 0b010101;
 System.out.println(a);

 a = 0b11;
 System.out.println(a);

 a = 0xa;
 System.out.println(a);

 a = 0xa +  0b01;
 System.out.println(a);

 a = 0b1_1;
 System.out.println(a);
 }
}
実行結果
21
3
10
11
3

拍手[0回]

プロフィール
HN:
たんてーくん
性別:
非公開
フリーエリア
最新CM
[09/25 http://2017.bblbuy.com]
[09/24 http://www.japanform.com]
[09/23 http://www.japanform.com]
[09/22 http://www.japanform.com]
[09/21 http://2017.bblbuy.com]
ブログ内検索
忍者ブログ [PR]
* Template by TMP