Hatena::ブログ(Diary)

yumicroの日記 RSSフィード

2010-01-01

クラスメソッドとインスタンスメソッドの付け足し

11:57

会社の先輩から、簡単に教えてもらってパッとしたのでメモしておきます☆

インスタンスメソッド

インスタンスごとにやることや結果が変わってくるようなメソッド。

例えば、食べ物が腐っているか腐っていないかを判定するフラグ

引数としてもつメソッドがあるとします。そのフラグには、

食べ物が腐って無い場合は0をセットし、腐っていたら1をセット

するような決まりにします。0か1のどちらがセットされたことに

よって、その後の処理が変わってくるようなメソッドをインスタンス

メソッドにします。このように、インスタンスによってやることや結果

が変わってくるメソッドをインスタンスメソッドにするそうです。


●クラスメソッド

インスタンスによらず、いつも同じことしかしないメソッド。

例えば、四角形の面積の計算は『縦×横』なので、縦と横の長さを

引数とするメソッドを作れば、面積の異なる四角形でもいつも

四角形の計算しかしません。つまり、インスタンスによってやること

は変わらないのです。

imai78imai78 2010/01/03 19:01 つまり。。。
boolean is腐ってる(int 食べ物の状態フラグ) {
return 食べ物の状態フラグ == 1;
}
という感じなら、引数以外に戻り値を変動する要素がないので、クラスメソッドで良いじゃん、って事でしょうか。

んで、インスタンスメソッド風に書くなら
public class 食べごろ判定器 {
private int 食べ物の状態フラグ;
public 食べごろ判定器(int 食べ物の状態フラグ) {
this.食べ物の状態フラグ = 食べ物の状態フラグ;
}
public boolean is腐ってる() {
return this.食べ物の状態フラグ == 1;
}
}
というふうになる、って事ですかね?

nu_manu_ma 2010/01/05 16:36 現在仕事でjavaをやっているので、ここを見れば勉強になりそうです。色々教えてください。(割と切実に)

hodoshimahodoshima 2010/01/06 23:55 >imai78さん

コメントありがとうございます!!
しかも例まで挙げて頂いて(^_^)
私のイメージではまさに、例に挙げてくださったような感じです!
まだ自分で使い分けてはいないので、難しいことはわかりませんが、imai78さんのブログに書かれていることを参考にして勉強してみます!!ありがとうございます(T_T)

hodoshimahodoshima 2010/01/06 23:58 >nu_maさん

コメントありがとう!
あたしも手探りだから自信ないけど、私のでよければ参考にしてくださいな☆たまにしかアップしないけど・・・。最近は研修で使ってたjavaの本の下巻を読み返してるよ♪今読むと、前より解るよ☆

imai78imai78 2010/01/07 01:36 http://b.hatena.ne.jp/entry/d.hatena.ne.jp/hodoshima/20100101/1262314670
にもあるようにフラグではなくフィールドだよね、というのを湾曲に表現した例でした。

ActionScriptで書かなくても怒られなかったのでほっとしました。

2009-12-26 インスタンスとクラス

もうプログラミングを始めて半年も経つのに、インスタンスメソッドとクラスメソッドの

概念が結構あやふやです。なので、本とか読んで自分なりにわかったことをこの機会にま

とめておこうと思います。


インスタンスフィールドとクラスフィールド

インスタンスフィールド

フィールドはクラスが持つ変数

インスタンスを生成すると、そのフィールドはインスタンス単位で発行されます。

なので、インスタンスAとインスタンスBのフィールドは同じ名前でも全く関連が

ありません。また、『this.フィールド名』と書くと、今生成したインスタンス

フィールドという意味になります。


クラスフィールド

クラスフィールドはstaticが付いたフィールド。

つまり静的フィールドなので、インスタンスにごとに生成されるフィールドではなく、

そのクラスにたった一つしかないフィールドです。

『this.フィールド名』と書くとコンパイルエラーになります。

なぜなら、thisはインスタンス自体を示しているので、クラスフィールドを示して

いることにならないからです。

このフィールドはインスタンスごとに初期化されては困るような、また、クラスの

中で保持しておきたいデータなどに用いるみたいです。

ゲームで例えるなら、

今生きているプレイヤーの人数を保持するのがクラスフィールド(インスタンス全体を把握)

今のプレイヤーが生きているかどうかを保持するのがインスタンスフィールド(個々のインスタンスを把握)

もし生きているプレイヤーの人数を保持するフィールドがクラスフィールドでなく、インスタンスフィールドだったら、

インスタンスを生成する度に初期化されてしまうので、ずっと初期値と変わらない状態になります。


インスタンスメソッドとクラスメソッド

インスタンスメソッド

概念としては、インスタンスフィールドと一緒です。

現在のインスタンスの状態を調べたり、現在のインスタンスに対して処理を行ったりするメソッド

(つまり、インスタンスフィールドを使って計算を行うメソッド)のことを言います。


クラスメソッド

staticが付いたメソッドです。

そのクラス変数(フィールド)に対して計算や処理を行ったり、そのクラスのインスタンスの中から

ある特定のインスタンスを見つけ出すメソッドのことを言います。



わたしの中で、概念的なものはわかっているのですが、実際に自分で使い分けろと言われても

どういう時に使い分けたらいいのかがわからないのでパッとしません。。。。

会社の先輩が書いたソースをみると、共通処理をクラスメソッドにしています。

でも、共通処理でもクラスメソッドにできないものもあるみたいで・・・・・。

その違いは未だよくわからず。。。。

完全に理解するには、まだまだ勉強が必要です(>_<)

2009-12-02 Iterator

久々の更新です。

Iteratorについて調べてみました。

あるコレクションからデータを取り出すためには、いくつかの方法があります。

例えば、ArrayListから要素を取り出すときはfor文でこんな風に取り出します。

ArrayList<String> array;
array.add("りんご");
array.add("ごりら");
array.add("らっぱ");
int i;

for ( i = 0; i < array.size(); i++ ){
			
    System.out.println("中身:"+ array.get(i));
}

でも、これだと、いくつか問題点があります。

☆ ArrayListの中身を簡単に変更できてしまう

☆ 取り出したいものの型(今回はArrayList)によって、使用するメソッド(今回はget(i))が変わってきてしまう

これではデータを隠蔽することができず、大問題です。



そこで便利なのがIterator


これは、さきほどの問題を解決することができます。

要素を取り出す側からは、要素を変更することができませんし、何の型かわからなくても

要素を取り出すことができます。

しかも、for文では最初の要素から最後の要素まで順に取り出すことしかできませんが、

Iteratorは色んなメソッドがあり、逆方向からも要素を取り出すことができます。


Iterator<String> it = array.iterator();
while (it.hasNext())
{
     Object val = it.next();
     System.out.println(val.toString());
}

☆hasNext()

次の要素が存在するならtrueを、存在しないならfalseを返す


☆next()

要素の添え字をひとつ進めて次の要素をポイントする


そのほかにも色んなメソッドが。。。。

☆reset()

添え字をコレクションの始点に戻す


☆current()

添え字を進めないで、現在の要素を返す


色んな機能があるんですね♪

nu_manu_ma 2009/12/07 16:52 あなたの同期のnu_maです。
めちゃめちゃ久しぶりの更新じゃないですかw
何気に見てるので頑張って更新してください。

hodoshimahodoshima 2009/12/27 01:20 おおお!
コメントしてくれてることに全然気付かなかったww
見てくれてるのか!そりゃありがたい!
なんか違うとことかあったら、教えてね☆

2009-09-13 DataGridの中のChekBox

DataGridはdataProviderにセットされたデータを

表示することができます。

ただ単に、文字をDataGridに表示させるだけならば

簡単なんですが、ユーザーによって表示内容が変え

られてしまうものを表示するときは一苦労しなくて

はなりません。


例えば、DataGridの中にCheckBoxを表示させる例が

あります。

CheckBoxはユーザーによって、チェックを入れられ

たり、はずされたりしますよね?

なので、しょっちゅう表示内容が変えられてしまいます。

表示内容が変わるということは、表示する元のデータで

ある、dataProviderの中のデータも変更させなくてはな

りません。初期表示でチェックがはずされていたら、

DataProviderの中のチェックボックスに関するデータは

falseになっているはずですが、ユーザーによってチェッ

クボックスにチェックを入れられてしまったら、

dataProviderのデータもtrueにしなくてはなりません。


具体的に説明すると、下のActionScriptのソースを見

て下さい。

houseという変数がありますが、これはメイン画面の

DataGridのDataProviderにセットされてるデータです。

さらにこの中にはchkという要素があり、これはDataGrid

の4番目のカラムで「選択」というカラムがdataFieldと

して指定しているデータです。

このchkはチェックボックスのselected(チェックの有無

を決めるプロパティ)をtrueにするかfalseにするかを指

定しています。デフォルトではfalseにしているので、

チェックボックスの初期表示はチェックがはずされた状態

になります。


しかし、ユーザーによってチェックが入れられてしまったら・・・。

このchkの内容を書き換えなくてはなりません。

なぜなら、DataGridはdataProviderの値を見ているわけです

から、表示内容が変更されたらdataProviderの内容も書き換

えてあげないと、表示内容も変更されないからです。

なんだかややこしいですね。

簡単に説明すると、下の様な流れになります。


1.ユーザーがチェックボックスにチェックを入れる

         ↓

2.dataProviderのchkの値がfalseからtrueになる

         ↓

3.chkがfalseからtrueに変更されたことをDataGridが

  dataProviderによって参照する

         ↓

4.チェックボックスにチェックが入る


次に、その作業をどこで行っているかです。


<itemRenderer>

DataGridにコンポーネントを組み込む時は、itemRenderer

というものを使います。メイン画面のmxmlのDataGridの

DataGridColumnに書いてあるプロパティです。

ここに、自分で作ったカスタムコンポーネント(ChekBoxEx)

のパスを入れてあげます。

これでチェックボックスは表示できます。


<changeイベント>

さらにCheckBoxExについてですが、ここに書いてあるCheckBox

にchangeというイベントについて説明します。これは、チェッ

クボックスがユーザーによっていじられた時に発生するイベン

トです。

この中に書いてある式は、「ユーザーからいじられたら、データ

プロバイダで参照しているchkというプロパティに、このチェック

ボックスのselectedの状態を代入しろ」という意味です。

チェックボックにチェックが入ったら、このチェックボックス

selectedはtrueになるので、このtrueがchkに代入されるんです。

ここでdataProviderの値は初めて変更されるわけです。

上のフローでいう、2の部分ですね。


<dataChangeイベント>

さらに、CheckBoxExのrootになっているHBoxですが、ここに

dataChangeイベントがあります。

これはdataProviderの値が変更された時に発生するイベントです。

先ほどのchengeイベントによってdataProviderが参照しているchk

の値は変更されましたから、そのタイミングでdataChangeイベント

は発生します。

ここの式では、「もしdataProviderが参照しているchkの値がtrue

になっていたら、このチェックボックスのselectedにtrueを入れろ」

という意味です。

chkは今trueに変更になっているので、trueをチェックボックス

selectedに代入しているわけです。ここで初めてチェックボックス

にチェックが入るわけです。

上のフローでいう、3と4の部分ですね。


チェックボックスひとつをDataGridに表示させたいだけなのに、

こんな大変なんて面倒臭いです。

この方法はチェックボックス意外にTextInputなどのデータが

ユーザーによって書き換えられた時も使えるので、参考にし

てみてください☆




ソース

☆メイン画面のmxml

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:helper="test.*">

<helper:Action id="helper"/>

<mx:Panel width="100%" height="50%" layout="vertical">

<mx:DataGrid id="dg" dataProvider="{helper.house}" textAlign="center">

<mx:columns>

<mx:DataGridColumn dataField="date" headerText="日付" itemRenderer="mx.controls.TextInput"/>

<mx:DataGridColumn dataField="contents" headerText="項目" itemRenderer="mx.controls.TextInput"/>

<mx:DataGridColumn dataField="price" headerText="使った金額" itemRenderer="mx.controls.TextInput"/>

<mx:DataGridColumn id="dgChk" dataField="chk" headerText="選択" itemRenderer="test.CheckBoxEx" rendererIsEditor="true" editorDataField="selected"/>

</mx:columns>

</mx:DataGrid>

</mx:Panel>

</mx:Application>

☆メイン画面のActionScript(Acstion.as)☆

package test
{
	import mx.collections.ArrayCollection;
	import mx.collections.XMLListCollection;
	import mx.controls.Alert;
	
	public class Action
	{    
        [Bindable]
        public var house:XMLListCollection = new XMLListCollection(
			new XML(<root>
				 <house>
				 	<date>2009/10/24</date>
				 	<contents>光熱費</contents>
				 	<price>3000</price>
					<chk>false</chk>
				 </house>
				  <house>
				 	<date>2009/10/25</date>
				 	<contents>洋服</contents>
				 	<price>2000</price>
					<chk>false</chk>
				 </house>
				 <house>
				 	<date>2009/10/26</date>
				 	<contents>家賃</contents>
				 	<price>60000</price>
					<chk>false</chk>
				 </house>
			</root>).house);
			
	}
}

☆itemRendererが参照しているコンポーネント(ChechBoxEx.mxml)☆

<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" horizontalAlign="center" verticalAlign="middle" dataChange="dataGridColumnCheckBox.selected = (data.chk == true)">

<mx:CheckBox id="dataGridColumnCheckBox" change="data.chk = dataGridColumnCheckBox.selected"/>

</mx:HBox>


画面

f:id:hodoshima:20090914021608p:image

も 2009/09/14 10:51 CheckBox単体ならDataGridColumnタグに editorDataField="selected" でいけるんですけどね。(説明の1.2.と同等の処理をしてくれます)
コンテナでくるんだり、複数の入力項目を含んだアイテムレンダラーだと、処理を自前で書いてやらないといけないので面倒ですね。

も 2009/09/14 10:54 書き忘れました。
CheckBox単体ならDataGridColumnタグに dataField="selected" editorDataField="selected" でいけます。(dataField="selected" が3.4.に対応します )

2009-08-22 簡単なクイズアプリ♪

FlexBilderは60日間のお試し期間が終わってしまうと、お金を払わなければ使えなくなってしまうので、

imai78さんからオススメいただいた、FlexDevelopという無償のツールをインストールしてみました★

なんら使い心地は変わらないです♪


今回はRadioButtonとAlertの使い方でクイズが作れる事を知ったので、覚え書きします!

ソース

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">

<mx:Script>

import mx.controls.Alert;

</mx:Script>

<mx:Panel title="首都を当てようクイズ!" height="75%" width="75%"

paddingTop="10" paddingLeft="10" paddingRight="10">

<mx:Label width="100%" color="blue"

text="日本の首都はどこですか?"/>

<mx:RadioButton groupName="capitalCity" id="answer1" label="京都"/>

<mx:RadioButton groupName="capitalCity" id="answer2" label="広島"/>

<mx:RadioButton groupName="capitalCity" id="answer3" label="東京"/>

<mx:RadioButton groupName="capitalCity" id="answer4" label="宮崎"/>

<mx:Button label="クリック!"

click="Alert.show(answer3.selected?'正解!!':'不正解・・・。', '結果')"/>

</mx:Panel>

</mx:Application>


実行結果

☆初期画面☆

f:id:hodoshima:20090823012101p:image


☆正解アラート☆

f:id:hodoshima:20090823012059p:image


☆不正解アラート☆

f:id:hodoshima:20090823012056p:image



説明

ポイントは赤で示したAlert.showの部分です!

Alert.showはアラート画面を出す為だけに使っていましたが、色んな使い方ができるんですね!


一つ目の引数(answer3.selected?'正解!!':'不正解・・・。')


RadioButtonのid名がanswer3のものが選択されたら、「正解!!」とアラートに表示させます

つまり、「東京」が選択されたら「正解!!」が表示されます。

また、それ以外のものが選択されたら「不正解・・・。」を表示させることができます。



二つ目の引数('結果')


アラートの左上に表示される題名を設定することができます。

も 2009/09/14 10:34 フリーのFlex開発環境としてはEclipseプラグインのAIRGEARもあります。フリーなのにWYSIWYGのGUIビルダがあることが特徴でしたが、最近デバッガやコード補完機能もついて、最強のフリー開発環境になっているようです。日本語版なところもよいですね。
http://amateras.sourceforge.jp/cgi-bin/fswiki/wiki.cgi?page=AIRGEARDoc