2010-01-01
クラスメソッドとインスタンスメソッドの付け足し
会社の先輩から、簡単に教えてもらってパッとしたのでメモしておきます☆
●インスタンスメソッド
インスタンスごとにやることや結果が変わってくるようなメソッド。
例えば、食べ物が腐っているか腐っていないかを判定するフラグを
食べ物が腐って無い場合は0をセットし、腐っていたら1をセット
するような決まりにします。0か1のどちらがセットされたことに
よって、その後の処理が変わってくるようなメソッドをインスタンス
メソッドにします。このように、インスタンスによってやることや結果
が変わってくるメソッドをインスタンスメソッドにするそうです。
●クラスメソッド
インスタンスによらず、いつも同じことしかしないメソッド。
例えば、四角形の面積の計算は『縦×横』なので、縦と横の長さを
引数とするメソッドを作れば、面積の異なる四角形でもいつも
四角形の計算しかしません。つまり、インスタンスによってやること
は変わらないのです。
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()
添え字を進めないで、現在の要素を返す
色んな機能があるんですね♪
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>
画面
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>
実行結果
☆初期画面☆
☆正解アラート☆
☆不正解アラート☆
説明
ポイントは赤で示したAlert.showの部分です!
Alert.showはアラート画面を出す為だけに使っていましたが、色んな使い方ができるんですね!
一つ目の引数(answer3.selected?'正解!!':'不正解・・・。')
RadioButtonのid名がanswer3のものが選択されたら、「正解!!」とアラートに表示させます
つまり、「東京」が選択されたら「正解!!」が表示されます。
また、それ以外のものが選択されたら「不正解・・・。」を表示させることができます。
二つ目の引数('結果')
アラートの左上に表示される題名を設定することができます。




boolean is腐ってる(int 食べ物の状態フラグ) {
return 食べ物の状態フラグ == 1;
}
という感じなら、引数以外に戻り値を変動する要素がないので、クラスメソッドで良いじゃん、って事でしょうか。
んで、インスタンスメソッド風に書くなら
public class 食べごろ判定器 {
private int 食べ物の状態フラグ;
public 食べごろ判定器(int 食べ物の状態フラグ) {
this.食べ物の状態フラグ = 食べ物の状態フラグ;
}
public boolean is腐ってる() {
return this.食べ物の状態フラグ == 1;
}
}
というふうになる、って事ですかね?
コメントありがとうございます!!
しかも例まで挙げて頂いて(^_^)
私のイメージではまさに、例に挙げてくださったような感じです!
まだ自分で使い分けてはいないので、難しいことはわかりませんが、imai78さんのブログに書かれていることを参考にして勉強してみます!!ありがとうございます(T_T)
コメントありがとう!
あたしも手探りだから自信ないけど、私のでよければ参考にしてくださいな☆たまにしかアップしないけど・・・。最近は研修で使ってたjavaの本の下巻を読み返してるよ♪今読むと、前より解るよ☆
にもあるようにフラグではなくフィールドだよね、というのを湾曲に表現した例でした。
ActionScriptで書かなくても怒られなかったのでほっとしました。