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

2024

0510
×

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

2015

0531
・プロパティをclassで保持するパターンを提供する。
・プロパティ群の取得は、ResourceBundle#getBundle
・ListResourceBundleを実装するクラスは、publicであること(パッケージプライベートだと参照できなかった)。

ListResourceBundleSample.java
package may20150531;

import java.util.ListResourceBundle;

public class ListResourceBundleSample extends ListResourceBundle {

	@Override
	protected Object[][] getContents() {
		Object[][] values = new Object[][] {
				{ "key1", "val1" },
				{ "key2", "val2" }
		};
		return values;
	}
}


ListResourceBundleSample.java
package may20150531;

import java.util.Enumeration;
import java.util.ResourceBundle;

public class ListResourceBundleTest {
	public static void main(String[] args) {
		ResourceBundle lrb = ResourceBundle.getBundle(ListResourceBundleSample.class.getName());
		Enumeration<String> keys = lrb.getKeys();

		while (keys.hasMoreElements()) {
			String element = keys.nextElement();
			System.out.println(element + ":" + lrb.getString(element));
		}
	}
}


実行結果
key2:val2
key1:val1

拍手[0回]

PR

2015

0531
・Comparableは、比較可能なという形容詞。その実体はインタフェースであり、比較可能なオブジェクトであることを示し、比較を実行可能な状態にする。

・Comparatorは、比較する者であることを示しており、あるオブジェクトを対象に比較する際のルールを制定する。

よって、
Comaprableを実装する場合は、唯一の比較表現を示すことになる。
Comparatorは、比較ルールの一つとして、比較表現を示すことになる。

ComparableのJavaDocの冒頭にも
このインタフェースを実装する各クラスのオブジェクトに全体順序付けを強制します。この順序付けはクラスの自然順序付けと呼ばれ、このクラスの compareTo メソッドは自然比較メソッドと呼ばれます。
という表記がある。


拍手[0回]

2015

0531
・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
name=sampleProp
key1=20150531
lang=Japan
sampleprop_en_US.properties
name=sampleProp
key1=20150531
lang=English
ResourceBundleTest.java

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");
20150531
sampleProp
Japan
--------------------------
ResourceBundle.getBundle("\may20150531\resourcebundle\sampleprop", Locale.JAPAN);
20150531
sampleProp
Japan
--------------------------
ResourceBundle.getBundle("\may20150531\resourcebundle\sampleprop", Locale.US);
20150531
sampleProp
English

拍手[0回]

2015

0530
■凝集度
 クラスの機能と属性の関連の強さを示す。

 併せて読みたい
 設計におけるオブジェクトの責務分配に有効なものさし

■結合度
 オブジェクト間の依存度を示す。

■好ましい設計
 高い凝集度と低い結合度である。

■集約
 あるクラスを成り立たせるうえで、いくつかのクラスを持ったうえで成り立つ。
 いくつかのクラスは、そのクラスのメンバーとなる。

■集約の中でも特に強いものをコンポジションと呼ぶ
 コンポジションは、メンバーと主たるクラスの生存期間が同一である。

 分類と分解をUMLで表現する
 
 こちらのリンクでは、ノートPCはコンポジションと語られており、
 定義と例えが一致する。
 ノートPCは一体型のため、パーツが壊れたら代えが効かないもの(厳密にはメーカサポートなどがあるので違うが)。

 コンポジションのほうが、綺麗につかえて良いということになる。
 
 私見だが、コンポジションを詰めていくと、下位レイヤ(ディスクアクセスやネットワークアクセス)を司るメンバーの生成コストがクラスにおける生成コストの大部分を占めてしまうことになる。
 今は、コネクションプールやディスク資産のメモリキャッシュなどが組み込めるので大きな問題ではないのかもしれない。

拍手[0回]

2015

0527
・内部クラスのことをネステッドクラスと呼ぶ
・最上位のネストされていないクラスをトップレベルクラスと呼ぶ
・外部クラスから内部クラスのインスタンス変数へのアクセスは不可能。
・内部クラスから外部クラスメンバのアクセス方法は、
 インスタンスメソッド内では、外部クラス名.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--------------------
0
0
0
3
2
3
2
-----------------Inner Class--------------------
1
1
0
2
2
2
-----------------Outer Class--------------------
0
0
0
3
2
3
2
-----------------Inner Class--------------------
3

拍手[0回]

<< 前のページ | HOME | 次のページ忍者ブログ [PR] * Template by TMP >>
プロフィール
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