よくわからないことを調べて解説してみるブログ。
2015
・ResourceBundleは、国際化に対応したPropertiesクラス
・ResourceBundleはnew でインスタンス化できない
・ResourceBundle#getBundle等を使う。
このメソッドの実行時には、パス付きプロパティファイル名(拡張子なし)を指定する。
引数にLocaleを指定可能であり、指定のLocaleに応じたプロパティファイルを取得する。
取得時のファイル名のルールなどはJavaDoc参照されたい(ResourceBundle#getBundle)。
・なお、プロパティファイルからの取得の場合、暗黙的にPropertyResourceBundleが返却されている(クラスファイルからの取得の場合は、ListResourceBundleが返却される)。
・PropertyResourceBundle について仕様を把握したうえで使うべきである。
サンプルソース
フォルダ構成
src/may20150531
┗ ResourceBundleTest.java
/resourcebundle
┗・sampleprop_jp_JA.properites
・sampleprop_en_US.properties
sampleprop_jp_JA.properites
・ResourceBundleはnew でインスタンス化できない
・ResourceBundle#getBundle等を使う。
このメソッドの実行時には、パス付きプロパティファイル名(拡張子なし)を指定する。
引数にLocaleを指定可能であり、指定のLocaleに応じたプロパティファイルを取得する。
取得時のファイル名のルールなどはJavaDoc参照されたい(ResourceBundle#getBundle)。
・なお、プロパティファイルからの取得の場合、暗黙的にPropertyResourceBundleが返却されている(クラスファイルからの取得の場合は、ListResourceBundleが返却される)。
・PropertyResourceBundle について仕様を把握したうえで使うべきである。
サンプルソース
フォルダ構成
src/may20150531
┗ ResourceBundleTest.java
/resourcebundle
┗・sampleprop_jp_JA.properites
・sampleprop_en_US.properties
sampleprop_jp_JA.properites
sampleprop_en_US.propertiesname=samplePropkey1=20150531lang=Japan
ResourceBundleTest.javaname=samplePropkey1=20150531lang=English
package may20150531;
import java.util.Enumeration;
import java.util.Locale;
import java.util.ResourceBundle;
public class ResourceBundleTest {
public static void main(String[] args) {
System.out.println(Locale.getDefault());
System.out.println("--------------------------");
System.out.println("ResourceBundle.getBundle(\"may20150531.resourcebundle.sampleprop\");");
ResourceBundle bundle = ResourceBundle.getBundle("may20150531.resourcebundle.sampleprop");
Enumeration keys = bundle.getKeys();
while (keys.hasMoreElements()) {
System.out.println(bundle.getString(keys.nextElement()));
}
System.out.println("--------------------------");
System.out.println("ResourceBundle.getBundle(\"may20150531.resourcebundle.sampleprop\", Locale.JAPAN);");
bundle = ResourceBundle.getBundle("may20150531.resourcebundle.sampleprop", Locale.JAPAN);
keys = bundle.getKeys();
while (keys.hasMoreElements()) {
System.out.println(bundle.getString(keys.nextElement()));
}
System.out.println("--------------------------");
System.out.println("ResourceBundle.getBundle(\"may20150531.resourcebundle.sampleprop\", Locale.US);");
bundle = ResourceBundle.getBundle("may20150531.resourcebundle.sampleprop", Locale.US);
keys = bundle.getKeys();
while (keys.hasMoreElements()) {
System.out.println(bundle.getString(keys.nextElement()));
}
}
}
実行結果ja_JP--------------------------ResourceBundle.getBundle("\may20150531\resourcebundle\sampleprop");20150531samplePropJapan--------------------------ResourceBundle.getBundle("\may20150531\resourcebundle\sampleprop", Locale.JAPAN);20150531samplePropJapan--------------------------ResourceBundle.getBundle("\may20150531\resourcebundle\sampleprop", Locale.US);20150531samplePropEnglish
PR
2015
■凝集度
クラスの機能と属性の関連の強さを示す。
併せて読みたい
設計におけるオブジェクトの責務分配に有効なものさし
■結合度
オブジェクト間の依存度を示す。
■好ましい設計
高い凝集度と低い結合度である。
■集約
あるクラスを成り立たせるうえで、いくつかのクラスを持ったうえで成り立つ。
いくつかのクラスは、そのクラスのメンバーとなる。
■集約の中でも特に強いものをコンポジションと呼ぶ
コンポジションは、メンバーと主たるクラスの生存期間が同一である。
分類と分解をUMLで表現する
こちらのリンクでは、ノートPCはコンポジションと語られており、
定義と例えが一致する。
ノートPCは一体型のため、パーツが壊れたら代えが効かないもの(厳密にはメーカサポートなどがあるので違うが)。
コンポジションのほうが、綺麗につかえて良いということになる。
私見だが、コンポジションを詰めていくと、下位レイヤ(ディスクアクセスやネットワークアクセス)を司るメンバーの生成コストがクラスにおける生成コストの大部分を占めてしまうことになる。
今は、コネクションプールやディスク資産のメモリキャッシュなどが組み込めるので大きな問題ではないのかもしれない。
クラスの機能と属性の関連の強さを示す。
併せて読みたい
設計におけるオブジェクトの責務分配に有効なものさし
■結合度
オブジェクト間の依存度を示す。
■好ましい設計
高い凝集度と低い結合度である。
■集約
あるクラスを成り立たせるうえで、いくつかのクラスを持ったうえで成り立つ。
いくつかのクラスは、そのクラスのメンバーとなる。
■集約の中でも特に強いものをコンポジションと呼ぶ
コンポジションは、メンバーと主たるクラスの生存期間が同一である。
分類と分解をUMLで表現する
こちらのリンクでは、ノートPCはコンポジションと語られており、
定義と例えが一致する。
ノートPCは一体型のため、パーツが壊れたら代えが効かないもの(厳密にはメーカサポートなどがあるので違うが)。
コンポジションのほうが、綺麗につかえて良いということになる。
私見だが、コンポジションを詰めていくと、下位レイヤ(ディスクアクセスやネットワークアクセス)を司るメンバーの生成コストがクラスにおける生成コストの大部分を占めてしまうことになる。
今は、コネクションプールやディスク資産のメモリキャッシュなどが組み込めるので大きな問題ではないのかもしれない。
2015
・内部クラスのことをネステッドクラスと呼ぶ
・最上位のネストされていないクラスをトップレベルクラスと呼ぶ
・外部クラスから内部クラスのインスタンス変数へのアクセスは不可能。
・内部クラスから外部クラスメンバのアクセス方法は、
インスタンスメソッド内では、外部クラス名.this.メンバメソッドまたはメンバ変数
・内部クラスのstaticメンバ変数はfinal修飾子が必須。
・内部クラスにstaticメソッドは定義できない
(staticメソッドは、トップレベルクラスにのみ定義可能。)
上記ゆえに
・インスタンス化する内部クラスは外部クラスのインスタンス化を前提にしている
・thisは相対的な自身を指している
・最上位のネストされていないクラスをトップレベルクラスと呼ぶ
・外部クラスから内部クラスのインスタンス変数へのアクセスは不可能。
・内部クラスから外部クラスメンバのアクセス方法は、
インスタンスメソッド内では、外部クラス名.this.メンバメソッドまたはメンバ変数
・内部クラスのstaticメンバ変数はfinal修飾子が必須。
・内部クラスにstaticメソッドは定義できない
(staticメソッドは、トップレベルクラスにのみ定義可能。)
上記ゆえに
・インスタンス化する内部クラスは外部クラスのインスタンス化を前提にしている
・thisは相対的な自身を指している
public class SameValInnerClassAndOuterClass {
static final int sttnum = 3;
int num = 0;
void printNum() {
System.out.println("-----------------Outer Class--------------------");
System.out.println(num); // 0
System.out.println(this.num);// ここでのthisは、外部クラスを指す。 // 0
System.out.println(SameValInnerClassAndOuterClass.this.num); // 0
System.out.println(sttnum); // 3
System.out.println(InnerClass.sttnum); // 2
System.out.println(SameValInnerClassAndOuterClass.sttnum); // 3
System.out.println(SameValInnerClassAndOuterClass.InnerClass.sttnum); // 2
// this.printNum(); // 当然無限ループ
// this.new InnerClass().printNum(); // 当然無限ループ
}
class InnerClass {
static final int sttnum = 2; // 内部クラスでは、static変数はfinal修飾子が必須。
// static int getSttnum() { return sttnum;} // コンパイルエラー。staticメソッドはトップレベルクラスにのみ定義可能。
int num = 1;
void printNum() {
System.out.println("-----------------Inner Class--------------------");
System.out.println(num); // 1
System.out.println(this.num);// ここでのthisは、内部クラスを指す。 // 1
System.out.println(SameValInnerClassAndOuterClass.this.num); //内部クラスを保持する外部クラスのメンバへはアクセス可能。
// 0
System.out.println(sttnum); // 2
System.out.println(InnerClass.sttnum); // 2
System.out.println(SameValInnerClassAndOuterClass.InnerClass.sttnum); // 2
SameValInnerClassAndOuterClass.this.printNum(); // 内部クラスを保持する外部クラスへのメンバへはアクセス可能。
System.out.println("-----------------Inner Class--------------------");
System.out.println(SameValInnerClassAndOuterClass.sttnum); // 3
// SameValInnerClassAndOuterClass.printNum(); // static参照になるため、コンパイルエラー。
// this.printNum(); // 当然無限ループ
}
}
public static void main(String[] args) {
SameValInnerClassAndOuterClass outerClass = new SameValInnerClassAndOuterClass();
InnerClass innerClass = outerClass.new InnerClass();
outerClass.printNum();
innerClass.printNum();
// System.out.println(SameValInnerClassAndOuterClass.this.num); // staticコンテキストではthisを利用できないと言われる。
}
}
class TopLevel {
static void TopLevelMethod(){ // staticメソッドは、トップレベルクラスにのみ定義可能。
}
}
実行結果
-----------------Outer Class--------------------0003232-----------------Inner Class--------------------110222-----------------Outer Class--------------------0003232-----------------Inner Class--------------------3
2015
まとめ
・Enumクラスは抽象クラスである。
・EnumクラスはComparableを実装している。
・Enumクラスはequalsをfinal実装している。
・列挙型はEnumクラスを実装している。
・列挙型における列挙値は列挙型の実装である。
・Enumクラスでは、ordinalと呼ばれる順序付け変数を持っており、
列挙値のデフォルトコンストラクタの引数で与えられる。
この引数は、列挙型における列挙値の定義順と同値。
・列挙型は、インタフェースを実装することが出来る。
・列挙型は、new によるインスタンス化はできない。
・列挙型は、メソッドを定義出来る。呼び出し方法は、列挙値.メソッド名。
・列挙型は、抽象メソッドを定義出来る。列挙値ブロックで@Overrideを実装必須。
・列挙型は、内部にインタフェースを定義することが出来る。
併せて読みたい生かし方
・[Java] enum basics
・[Java] enumをもうちょっと使う
・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----------------------------------------------THROWPANCHKICK----------------------------------------------PANCH, ordinal = 0KICK, ordinal = 1THROW, ordinal = 2----------------------------------------------PANCHKICKTHROW
2015
- あるオブジェクト同士のequalsメソッドがtrueを返すとき、それぞれのオブジェクトのhashCodeは同一の値を返却しなくてはならない。
- ある2つのオブジェクトのhashCodeが不一致であるとき、そのオブジェクト同士によるequalsメソッドはfalseを返却しなくてはならない。
- ある2つのオブジェクト同士のequalsメソッドがfalseを返すとき、それぞれのオブジェクトはtrue,falseのいずれの値を返却しても良い。
- hashCodeは、同一のオブジェクトであるかぎり、同一の値を返さなくてはならない。
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 = trueunit2 hash = 2, set contains unit2 = trueunit1 hash = 1, set contains unit1 = false
プロフィール
HN:
たんてーくん
性別:
非公開
最新記事
(03/29)
(03/29)
(06/26)
(05/21)
(04/23)
カテゴリー
最新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]
ブログ内検索
