ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

エンジニア相談所(java、web)コミュのナナシー成長記

  • mixiチェック
  • このエントリーをはてなブックマークに追加
わたしのファンの方がわたし専用のトピを立ててよい、とおっしゃって頂けたのでお言葉に甘えて。

(090520時点)
経歴は、
文系出身の社会人四年目、
java歴二年くらい?、
製造経験二か月です。

製造の仕事がやってくる日のために、独学でjavaを勉強しているところです。

見掛けた方は、アドバイス・ダメだし等頂けたら幸いです。

コメント(246)

わかりました!

独自のフレームワークという言葉をたまに聞きますが、何をどうすることなのかイメージできません。
そういった解説サイトなどあるか見てみますが。

パッケージを分けるだけじゃないんですよね…?あせあせ(飛び散る汗)
> ナナシーさん

フレームワークとは枠組み的なクラス群を指し、アプリケーションを作る上で土台的な役割を示します。

例えば車の生産でも、ある程度ボディ部分はどの車も同じで、載せる部品やデザインで違う車になりますが、この部品を載せるフレーム部分をフレームワークと呼びます。

Webの画面遷移処理の枠組みを提供するフレームワークとしては、Strutsが有名です。

今回はStrutsを使わずに、これに代わる仕組み(フレームワーク)をご自身で作成してみては?
という提案です。

そうすると、中身でどんな事をしているのか、凄く理解しやすくなります。

私は複雑な仕組みを理解するには、基礎力が大切と考えていますので。
ちなみにフレームワークは下記のような利点があります。

・単純に再利用による開発工数削減
・決まった枠組みに載せて、アプリケーションを作る事で、造りが均一化しやすく、その結果保守性が上がる
・どの処理も土台から呼び出される事で、共通処理の追加が簡単

などが挙げられますね。
とりあえず思うように作ってみて、ここをこうふにまとめてみたら
便利になるんじゃないの?といった具合にやっていると
段々とフレームワークになっていく。

という考えはよろしくないでしょうか?

ちょっと今の段階だと難しいので、
まずフレームワークというキーワードは置いておいて「図書管理システムの
システム仕様」を考えてみます!
> ナナシーさん

まずはご自身のペースでいいと思いますよわーい(嬉しい顔)
スレッドの話について質問させてください。

参考書ではsynchronizedをメソッドに付ける場合、そのメソッドがstaticでないとクラス(フィールド?)は
ロックできない。
と書いてあったのですが、以下のようなコードはなぜこれでよいのでしょうか?

・フィールド
//Requestの数
private int count;

・メソッド
public synchronized Request takeRequest() {

 //Requestの数が0以下の間以下の処理を繰り返す。
 while(count <= 0) {
  try {
   //仕事が来るまで待つ。
   wait();
178から180の書き込みを再度読んでみて下さいわーい(嬉しい顔)
「staticメソッドにsynchronizedをつけないとクラスをロックできない」という言葉を参考書で見て、
Javaの仕様だと思いこんでいたのですが、それは仕様というわけではないのかなと思い始めました。

その本でも、ひろさんがおっしゃっていることと同じことを伝えたいだけなのでしょうか。
別の本やサイトでも上記で書いたような仕様になっているとはどこも書いていないので。。。


わたしの疑問についてまとめると、
メソッドやインスタンスに対してsynchronizedを指定すると、this(xxx.class)やフィールドの内のどれかがロック制御の対象となる。(メソッドにsynchronizedを付ける場合、そのメソッドがstaticでも非staticでもロック処理はされる。)
しかし、フィールドに対して想定外のアクセスがないようにするには抜け目ない対策が必要になる。
その方法として、
1.フィールドAにアクセスする可能性のあるメソッド全てにsynchronized指定をする。
2.フィールドA自体をシングルトンにする?
※1.2.間違っていたら指摘お願いします。

ひろさんがおっしゃるシングルトンの実装イメージがつかめていません。
180
>今はテストプログラムでオブジェクトを渡す側をコントロールしているので、意識していないのでしょうが、
とおっしゃる通り、その辺の参考書でシングルトンにした場合のサンプルを探そうとしても載っていないみたいです。

橋渡し役のクラスはシングルトン・・・んーーあと一歩がつかめないです。
うーん、何かずれてる気がしますね。。。

まず Class インスタンスって、JVM(Java Virtual Machine) の中で一つしか存在しません。static をつけたメソッドは、クラスメソッドになるので、Class インスタンスのものになります。

そんで繰り返しになりますが、synchronized でロックできる対象は、Class か、インスタンスに対してになります。
メソッドにつける場合は、static メソッドの場合は、Class 単位でロックされて、そうでない場合は、インスタンス単位でロックされます。
この辺のイメージは、178から180の書き込みを良く読み直して下さい。

インスタンスの場合、Singleton パターンを実装する事で、JVM に一つのインスタンスである事が保証できるため、Class にロックをかけるのと同じ感覚で扱えるわけです。
Singleton パターンを使っていないと、マルチスレッドプログラムの場合、同じインスタンスを共有できないので、synchronized しても意味無いわけです。
それぞれ別のインスタンスに、別のロックを取る事になるわけなんで。

そのために Singleton パターンの併用をオススメしました。

フィールドをロックしたいなら、ナナシーさんが考えるように、フィールドにアクセスするメソッド全部を synchronized しないと、意味無いです。
あ〜exclamation ×2わかりましたexclamation ×2
やっと>215の内容が全て理解しながら読めました。

thisとxxx.classの違いがわかってから、自分の中で全てのつじつまが合いました。


最後一つわからないのは、スレッドの動作を意味のあるものにするために、シングルトンにするように聞こえています。
橋渡しが複数ほしい場合があったら?
というのが疑問です。
シングルトンにしなくてはいけないというわけでなく、複数のスレッドで安全に一つのインスタンスを共有できる一つの例として挙げました。
インスタンスが共有できるなら他の方法でもロックはかけられますわーい(嬉しい顔)
そういう方法もあるということですね!
覚えておきます。

また話を変えさせていただくのですが、
ジェネリックスで
void <T extends Number> List<T> ( ArrayList<T> list) {...}
といったようなメソッド宣言はよくするものでしょうか?万が一書き方間違えていたらすみません、、

ジェネリックスは、今までフィールドに書くくらいでした。
メソッド宣言に書く場合どんな感じで書くものなんだろう?と疑問に思いました。
サイトで検索してもこんな書き方もできるよ、というのは出てくるのですが実際こんな使い方するよというのは載ってませんでした。

実際よく使われる使い方、テクニックなどの話がありましたら教えていただきたいです。

ちなみに、こんな使い方もするよいうのを本でみて、なるほどと思ったのは

メソッド宣言に、<T extends Serializable>のように引数の型宣言を書くことで、シリアライズしているクラスしか渡せないように制限をかけられる。

といったものがありました。
あ、でもそれって言い方だけの問題であくまでもジェネリックスは、指定の範囲内のクラスのオブジェクトなら対応できますよ。

というだけで、上でわたしが書いたような「...という制限をかけられる」というのは、そういう言い方もできるね。というだけの話。ということでしょうか!?あせあせ(飛び散る汗)
フレームワークを作るのに便利なんですよね。

例えば seaser2 のとある OR マッピングライブラリでは、

<T> SqlFileSelect<T> selectBySqlFile(Class<T> baseClass, String path) ;

と宣言する事で、

List<Employee> employeeList = jdbcManager.selectBySqlFile(Employee.class, "sql ファイル名").getResultList();

と書いたり、

List<Department> departmentList = jdbcManager.selectBySqlFile(Department.class, "sql ファイル名").getResultList();

と書いたりできるので、色んなオブジェクトにキャストせずにマッピングできるように作っています。

返り値の型宣言の前に、<T> という型宣言をする事で、メソッド側は具体的な型を決めないで作れます。
こいつの利点は、呼び出し側で、引数を渡せば、その型で返り値が受け取れるという点。
インターフェースを事前に決める必要もありません。

コードを書くと長くなるので割愛しますが、私は Hibernate を便利に使うための拡張で、クラス宣言にジェネリクスを使ったりもしています。
メソッドばかりでなく、クラス宣言で使うのも便利ですよ。
メソッドやクラスの宣言にジェネリクスを使ううまみは、インターフェースよりも緩い制限で、呼び出し側の都合で決めさせる事ができるのが良い点です。

<T extends Number> としておけば、

List<Integer> intList = getNumberList(Integer.class);
List<Long> longList = getNumberList(Long.class);

と、受け側がいい感じになりますが、

List<Number> getNumberList() の場合、

List<Number> numberList = getNumberList();

としなくてはいけないので、List<Integer>やList<Long>で受け取れません。
メソッドの機能がぶれるのでは?なんて思ってしまってたのですが、
メソッドの機能は変わらず、単純に扱えるもの(クラス)が柔軟になるということですね。
そういったライブラリでも作らないとあまり機会がない気もしちゃいますね。。


単発の質問を一つすみません。はいorいいえだけでも結構です。

has-a関係に関してなのですが、
class A {
 B b;
}
は間違いなくhas-a

では、
class A {
 method( ) {
  B b = null; ( or new B( ); )
 }
}
はhas-aになるのでしょうか?
サイトなどで説明を読んでいると参照さえもっていればなるようなことが
書いてあるので、has-aになるんじゃないかと思っているのですが。
実装だけを見れば、has-a じゃないですね。

個人的には実装的に結果 has-a というのは、正しくないと思うので、まずは概念の関連を考えた上で、has-a なのか?を考える方が重要だと思います。
まずはクラスの関連を考え、has-a だった場合、それを実装でどう表現するかという話になります。

実装だけを見て、has-a なのか、そうでないのか考えるなんて意味が無いという事です。概念モデルを実装する際に、無駄だから崩して実装なんて事はよくやる話なので。

オブジェクト指向は手段であって、目的では無いので、実装が厳密である必要はありません。
ただオブジェクト指向を逸脱し過ぎる設計をすると、問題がたくさん発生するので、崩す時はあくまで問題が無いようにする。

この辺はピカソの絵と同じですね。
素人目に見ると、落書きのように見えますが、実は高度な抽象画で、ただの落書きでは無いわけです。
確かに結果論の場合がある時点で、そうとは言い切れないですねあせあせ(飛び散る汗)納得です。
ありがとうございます。

ピカソの絵は部分的に分けて、分けたものをそれぞれ三角形にしてまたくっつけるような、当時他者と差別化しようとした手法らしいですねるんるん


今日equalsとhashCodeメソッドについて勉強してたのですが、ひろさんは業務の中でこれらをオーバーライドして使うことになったことがありますか?
ありましたら、必要になった経緯、メソッドの実装は何を考慮して実装したか。などを教えて頂きたいです。


わたしの想像だと、equalsメソッドをフィールドのなにか(id番号とか)で比較させたい都合がでてきた。
するとhashCodeもオーバーライドしなきゃいけなくなったので、hashCodeは一般的に推奨されている式を適当に…。
というレベルのイメージしかでしません。

よろしくお願いします。
equalsとhashCodeのオーバーライドは良くしますよ。
例えば勤務地マスタのエンティティ(伝わるかな。。)同士を比較する際に、インスタンスは別(メモリ上別)でも、比較した時に同じエンティティと判定したいので、例えば勤務地IDが同じ勤務地エンティティの場合、true を返すようにする。
hashCode は勤務地IDのハッシュを返すなどです。

ナナシーさんの想像と同じ感じですね。
要するに何を持って一致させたいかというのが、java.lang.Object の挙動と異なる場合に使います。

実装するタイミングは、ケースバイケースですね。
コメントありがとうございます。

その場合、hash値はintのidそのまま返す感じですか?

effective javaには固有のintの値をそのまま返せばよい。というような記述があったような!気がします。

情報処理受かった〜exclamation ×2

やった〜exclamation ×2

やった〜exclamation ×2

2、3週間後にはSJCPです。

資格取得の傍ら、業務で使える技術を身に付けなければ。

> ナナシーさん

良かったですねわーい(嬉しい顔)
引き続き頑張って下さい電球
お久し振りです。

今週土曜にSJCP(6.0向け)を受けてきます。

そこでまた質問をお願いしたいのですが、
List<?> list = new ArrayList<String>();
のようにジェネリックに?を使っていると、なぜ追加処理をできないように制限をかけているのでしょうか?

?だとクラスが特定できなくて不都合があるのかな、という想像つくのですが、よくわかりません。
<? super String>は追加処理できるのは、Objectクラス〜Stringクラスと特定できるからかなと思うのですが。

よろしくお願いします。

上記の記述じゃあ、シグニチャがわからないから、制限というより、エラーになるんではと。
オブジェクト型を使わずに、あえてそういう書き方をするという事は、
全てキャスト無しに書こうと思ってるからなのかもしれませんが、それだと java はコンパイルができないと思うので。
すみません言葉足らずでした。

普段私は書きませんが、下記のようなコードがあったとします。

List<?> list = new ArrayList<String>();
list.add("a");

このコードだと、addを書いているとこでコンパイルエラーになるのですが、コンパイルエラーになる理由がわかりません。

参考書では、?(ワイルドカード)をタイプ指定に使っているインスタンス変数には、追加(変更と書いてある本もある)処理ができないとあります。

私の疑問は、何を見てコンパイルエラーにしているのかということです。
addというメソッド名だけで判断していないだろうし、addのソースでlistにアクセスする箇所があるか見に行ってる…exclamation & question

それ以前にわかってないかもしれないのが、
List<?> list = new ArrayList<String>();
という場合はソースのList<T>のTがStringに置換してくれて変更もなにもできるんじゃないの?と思っているのですが、違うのでしょうか。。
まずコンパイラ側からすると、引数の型チェックと返り値の型チェックはタイミングと仕組みが違います。

引数はタイミングが、実行時(引数渡した時点)で、宣言した型に代入できるかで判断し、ワイルドカードを使った場合、オブジェクト型にするのは安全でないと判断するみたいですね。
null の場合は、型が関係ないので、入れても大丈夫。という感じです。

戻り値の場合、タイミングが、呼び出し側での変数への代入時で、メソッドの型宣言と違い緩く判定されるようで、Object 型への代入なら問題無いと判断するようです。

コンパイルすれば一発でわかるし、実務では全く必要のない知識(こんな使い方はしない)なんで、もし試験に出るからという意味であれば、時間をかけず、参考書の解答丸覚えですっと抜けるといいと思いますよ。
あれから色々試したことも併せて、試験に必要な知識は一通り付けられたと思うので
とりあえず大丈夫だと思います!

ちなみにHP−UXを扱う仕事が光臨しました!来週からです。
Java絡みでも使えるように覚えられるチャンスですね!
SJCP合格しましたOK

しかしそんなことどうでもよくなるくらい仕事の方があせあせ(飛び散る汗)な感じになりそうですが、チャンスだと思って頑張ろうと思います。
お久しぶりです。

現在は業務ではC言語使ってます。
windowsアプリも併用してます。

業務は改修なので、Cの基礎がバッチリでなくてもなんとかやれてしまってますが、
基礎を身につけナイトな・・・といった状態です。

ちなみに資格は今度応用情報受験します。
結構勉強してるので、可能性はあるかなという感じ。

C言語勉強しなきゃなぁ。
どうやってやっていけばいいですかねぇ〜
> ナナシーさん

お久しぶりですわーい(嬉しい顔)
やっぱり言語の勉強のはじめは基礎的な処理プログラムをたくさん組んで、業務に入っているなら、その上でソース解析も勉強になると思いますよ電球
★再開!☆

仕事を取りにいくときに、相手はうちに仕事を任せていいかは(デファクトな)資格の有無でしか判断できないんだ。だからとにかく時間を作って資格を取れ!

ということで資格資格言われてます。

SJC-WC(SUNJAVAのWEBのやつ)の取得に向けて、細々でも進めていこうと思ってます。
周りに質問ができる方もいないので、また質問させて頂きたいなと思いますので、宜しくお願いします。


資格ですかー。
俺自身一つも資格持ってないので、資格取得のアドバイスとかはあんまり得意じゃないですが、頑張って下さいわーい(嬉しい顔)

仕事を取るためという目的であれば、ナナシーさんのキャリアであれば、WEBアプリを一つ一人で作ってしまって、アピール欄とかに環境構築から開発まで一通りできます!とか強気な事を書けば、かなりアピールになると思いますよ。

給料上げるためという目的であれば、資格給とかもらえる会社だと、取らないと駄目ですけどね。

あと資格取るなら、マイナーな java の資格より、DB の資格とかの方がいいかもしれないですよ電球
NWとDBの二手に分かれて月1の勉強会をやってます。
たかだか月1なのでこれをやってるだけで取れることはないですが、取得予定には入ってますわーい(嬉しい顔)
NW、DBの順で考えてます。


javaの資格が話に出てきてるのは、幸いにも?会社が今javaの資格を薦めているからです。
SJC-Pは若手の半分は取れてきてしまっているので、好きな分野だし一足先に次いくかなといった具合です。
7月からは仕事に追われるので、それまでに出来るだけ進めたいところです。

今回の情報処理の結果をみて、社長が社員に「現場はそれぞれ離れていることもあって、会社は資格でしか判断できない」「会社もうちの会社を資格でしか判断できない」「企業価値を高めるのに一番早い手段だ」と言われました。

ひろさんのところは、教育はどんな感じでやっていますか?
今の私の会社は小さいので、教育とか決まったプロセスは無いですね。
少数精鋭を目指しているため、それぞれがそれぞれで勉強している形です。

会社の教育論という視点で言えば、会社のリソースや営業チャネルによって戦略が異なるので、ケースバイケースだと思います。
お久しぶりです。
Javaのwebアプリの勉強は事情により優先度が下がりました。
早ければ今年の10,11月から開始できそうです。

現在C言語で開発をしていて、
排他制御の「クリティカルパス、セマフォ、イベント、ミューテックス」
を今勉強中です。

聞きたいことが出てきたらここで質問してもいいですか?^^;
見落としてましたあせあせ(飛び散る汗)

正直C言語は私は全然やってないので、アドバイスは難しいかもたらーっ(汗)
他の誰か、助けてあげて下さいexclamation ×2
おひさしぶりです!

軽く近況報告です♪

H22秋に二つ目の国家資格:応用情報処理に合格しましたー!
毎週勉強会やったり頑張った甲斐あって、短期間でとれました。

最近は仕事以外に、自宅サーバを構築したり、Macパソコンを買って
知り合いとiphoneアプリ開発をはじめたりしてます^^
趣味としてはゴルフをコンスタントに練習しにいってますね。

ひろさんはあまりログインしていない様子ですが、
お仕事頑張っているのでしょうか♪

ではでは

ブログはじめました:http://d.hatena.ne.jp/nanacy7741/
おお、久しぶりですねー。

色々頑張ってるんですね。
最近は仕事が忙しくて。

お互い頑張りましょう!

ログインすると、残り206件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

エンジニア相談所(java、web) 更新情報

エンジニア相談所(java、web)のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング