まえがき †2012-1-28追記 JavaWorld, JavaPressなどのJavaの雑誌が無くなったのが2007年頃でしょうか。Web+DB PressやDB Magazineでたまに出てくると大抵スクリプト言語の実行環境としてか、Javaライブラリの呼び出しの話となりました。 Javaという単語が出てくるのは、TwitterがRubyをやめてScalaにしたとか、JRubyとか、Grailsとかで、どうも開発言語としてのJavaは話題になりません。 ScalaがJavaの発展系に思えて胸がときめきますが、このまま業務ソフトに使うのはどうか(ただしLiftフレームワークでラップすると多少楽になりますが)と思いますし、Rails系は確かに作るのは早く楽にできますが、一旦エラーになったときはデバッグ地獄です。 Spring CommunityがRooというRails的にコマンドでMVC+ORマッパーを自動生成するというツールが気持ちをやわれげてくれました。 日本ではSeaser ProjectとJavassist(JBossでも採用)の活躍が勇気を与えてくれました。 それにしてもJavaエンジニアは少し疲れているようです。 サーブレット, RMI(CORBA), JTS-JTA, Jini, EJB, Taglib, XML-XSLT-DOM-SAX, Struts, JSF, Hibernate, Spring.. と苦労して習得した技術が努力にみあうものだったのか考えてしまうのは、私がなまけものなせいだけではないと思います。 C言語は表面上は目立たなくなっていますが、OS、JavaVM、RubyVMなどほとんどの実行環境がすべてC言語で書かれています。Java言語もScala、JPython, Groovy, JRubyなどのライブラリ開発言語として残っていくと思われます。 まあ今からjavaをはじめたい人は少ないとは思いますが、本「Java道場」はまだ消さないでおきます。 短いサンプルによる成功体験が言語習得の早道と思い、簡単なサンプルを列挙しています。また、初級者が一度は通る失敗コードもいくつか含んでいますので、「失敗する」という句を見かけたら注意して見ていただきたく思います。 JavaFAQの内容が理解できるレベルが第1目標です。マルチスレッド、コールバックメソッド、CORBA/RMI、トランザクション(分散を含む)などJavaへの道は遠いですが、まずはバッチ(他のプロセス、スレッドとデータを共有しないプログラム)が自由自在に作れるようになれば業務プログラマとしてはたいてい大丈夫です。 それにしても最近はJavaを使った大きなプロジェクトの失敗が良く聞かれます。 凍結されずに実装中に変わる仕様、整合性のない設計書、経験の少ないコンサルタントと場合によりいろいろ原因はありますが、 Javaにもあまりに選択肢(staticメソッド/インスタンスメソッド、デザインパターンを使う/使わない、クラス名や定数をXMLファイルやプロパティファイルに持つ/持たない、機能の拡張に継承を使う/委譲を使う、使うフレームワークやライブラリ、テストツールなど)が多すぎて、プロジェクトとしての統一感を持つのが難しくなっています。 もちろん、コーディング規約とフレームワークでがちがちに縛ることも可能ですが、どこまで縛るのかと、どうチェックするかが問題です。またXML設定ファイルに膨大な記述が必要なフレームワークが多くてjavaの生産性に疑問も出ています。 後で書きますが、私が実プロジェクトで提案・導入して一番感謝されたのがJtestによるコーディング規約チェックと、JavaExcelライブラリによる設計書(設計書間を含む)のチェックでした。コーディング自体でないところがオジさんの悲哀かもしれませんが、アンチパターンの共有とチェックこそJava/オブジェクト指向に関係なく必要です。javaはそれがしやすいというメリットがある分救われているのかもしれません。 作者:城風敏彦 http://www5.plala.or.jp/shirokaze/ でご意見お待ちしています。コードの業務での利用は自由ですがメールを下さるとうれしいです。意外に和暦クラスのお問い合わせが多いです(^^) 言葉の洪水 †Javaやオブジェクト指向を勉強するとまず言葉の洪水に驚かされます。 "JDK"が"Java Development Kit" の略であるように、"J"ではじまるとたいてい"Java XXX YYY"の略です。 JRE,JTA,JTS,JSP,JSTL,JDBC,JFCなどきりがありませんが、何の略かくらいは 覚えておかないと、それが必要な打ち合わせでくやしい思いをしがちです。 あらかじめ、 Java FAQ、特に、 Java API FAQ : かんたん Java API 一覧/Java 略語一覧 で言葉に慣れておいた方がよいです。ここでわからなければウィキペディアやGoogleで 打合せの前に調べておきましょう。 開発環境 †2001年にJavaの開発環境の50%はエディタとJDK(Ant)でした。2006年には60%がEclipseとなり、その他はNetBeans,JBuilder,エディタ+Antが分け合っていました。近年は JBuilderも2008からEclipseベースになり、Javaの開発環境はEclipseの独占的状態は不変ですが、NetBeansの奮闘も見逃せないといった状態が当分続くでしょう。JDK/Ant/Mavenはアプリケーションサーバーへのリリース担当者だけは知っているべきでしょうが。 Java道場(開発環境編) に開発環境のメモを書いたので、時間のある方は見てやって下さい。 オブジェクト指向 †オブジェクト指向とは? †Googleで「オブジェクト指向とは」で検索すると、いろいろな観点で使われていることだけはわかります。 みんな自信を持って書いているようですが、Javaの実際のプロジェクトでは主流と思われたフレームワークが5年もたつと見向きもされなくなっています。EJBなどJava標準の技術、Strutsなどの有名なフレームワークは2000年から2005年くらいまで一世を風靡しましたが、2011時点ではレガシーとか存在自体が誤りだったといわれるし始末です。「J2EEパターンはEJBの使いにくさを解消するためのアンチパターン集」という文章が特に耳に残っています。 オブジェクト指向コンサルタントいわく
よくよく聞いてみるとCOBOLやCの発想と大差ないことが多いです。 結局のところ以下の2つの観点がからみあって、いったいどちらについて語っているのか誰にもわからないということでしょうか。
継承と委譲と集約 †JavaのクラスはObjectというクラスを頂点にした巨大な階層ツリーとなります。プログラマはその巨大なツリーのどこかに自分が必要なクラスに似たクラスがあるかを探し、ある時は継承し、あるときはラップして自作クラスを作ることになります。 以下にエラー処理に使う例外(Exception)関連のクラスの階層を書きます。ThrowableはObjectを継承し、ExceptionはThrowableを継承しています。プログラマが新規に作成するのは下で普通の例外(チェック例外ともいわれます)と書いたところで、Exceptionを継承するか、SQLExceptionなどのExceptionのサブクラスを更に継承するかします。 Object
雑誌などでは以下のような生物階層が良く出てきますが、プログラムとしてどうしたらよいかは不明です。メソッドとしては生まれる、成長する、繁殖する、戦う、共生する、死ぬなどでしょうが。 コンピュータシステムでは以下のような会計の勘定科目の方が集計という操作に使うので わかりやすいと思われます。ただしこのまま現金クラスのような細かいクラスを実装することはまずしないでしょうし、流動資産もクラスというより分類のためのインターフェース(実装のないクラス)でしょう。勘定科目クラスのインスタンスとして現金と名前のついた勘定科目インスタンスとするのが普通でしょう。 勘定科目
いつになったら自信がもてるか? †Javaプログラミングは作成するのは比較的容易ですが、自信をもつことがむずかしいです。 テストコードを書いて1メソッドあたり正常系2、異常系3のテストをしたとしても、すでにある機能を実装してしまったのではないか、性能は悪くないか、nullに対してメソッドを呼び出してNullPointerExceptionが発生して業務が止まるケースがおきるのではないか、マルチスレッド環境で値が思わぬものになってしまわないか、とか不安はつきません。 2000年頃デザインパターンという変更に強くて成功しやすいパターンがあるというので読んだ私は、少しでも修正の余地があればインターフェース、抽象クラス、実装クラスの3つ組みでコーディングし、実装クラス名は外部ファイルに書いてClass.forName(String).getInstance()でインスタンス化しなければかっこ悪いと思いこんでしまいました。 その後、デザインパターンの使いすぎが最大のアンチパターン(失敗につながる爆弾)ということを知り、羹に懲りてインターフェースを自分では宣言しなくなりました。32行中に16種類のパターンという笑い話も聞きましたし。 Struts,Seaser2などのフレームワークを使えば自動的にコマンド、テンプレートなどのデザインパターンとインターフェースを使うことになるので、まずは理解して使うのが先決です。 教科書やWebのサンプルコードは極端に単純化されていてそのまま業務で使うとコンパイルできない、例外処理がない、ログ出力がない、コメントがない、マルチスレッドでこけるなどのえらい目にあうこともあります。JavaVMのバージョンが違うだけで結果が変わることもあるので、全て自分でテストしなおすことが自信への第一歩です。 私もたいして自信はありませんが、以前に比較してすこしは自信は持てるようになったのはJtestなどのアンチパターンを理解できるようになった時です。また面倒でも単体テストにSystem.nanoSec()で処理時間を含めておくのも自信になります。 単体で異常系テストや性能にこだわっていると、結合テスト、回帰テストでの障害点も見当がつくようになり、みんなに感謝されて生きがいを感じられます:-) Java道場のサンプルコードも性能を含めた単体テストと業務で使える異常系処理をめざして加筆、修正つもりでおりますのでご期待ください。 基本文法 †フレームワーク †実践 †クラス、staticメソッド、コメント,標準出力 †
コマンド引数、int、String, 配列、ループ †
メソッド呼び出し †
インスタンス生成、インスタンスメソッド †
文字列結合 †
コレクション †
数値フォーマット †
ログ †
和暦クラス †
勤怠管理システム †JavaでExcel †ファイルアクセス †JDBC †
JSP、サーブレット †JSP(Java Server Pages)には見かけ上Classもmainも無い! 長大なmain()の中を書くようなもので、むしろ分かりやすいかも。マルチスレッドなので初心者はstatic変数もインスタンス変数も使わないでローカル変数だけで作成します。排他とかが必要ならStrutsのActionなどの通常のJavaクラスの中でやった方が良いです。 実行環境を作ったことのない方はTomcatインストールで環境設定してください。
帳票データ(HTML Table、CSV Tableとの変換) †
struts †
Struts1.3,Spring2.5,iBatis2.3環境設定 †Swing(JFC) †
Jtestのススメ †Hibernate †Weblogic11 †ご意見ください †リンク集 †
Counter: 24455,
today: 65,
yesterday: 85
since 2007/05/18. 著者: 城風敏彦 shiro's webへもどる |