読者です 読者をやめる 読者になる 読者になる

たかずんドットコム

文系Webプログラマから生み出される杜撰なTipsと日常の記録

「Javaプログラマであるかを見分ける10の質問」をJava初心者に説明する解を考える

お疲れ様です。たかずんです。

かなりの間、ブログ更新停滞しておりました。 最近は、Webサービスの設計業務と新人教育ばかりしており、あまりプログラミングが出来ていない日々が続いております。

Javaプログラマであるかを見分ける10の質問にチャレンジ

新人教育の肥やしになるかと思い、以下のブログのエントリを閲覧しておりました。 d.hatena.ne.jp そこで、記事内の問題に解答しつつ、Java初心者の新人にどうやって解説するかを自分なりに展開してみたいと思います。
私の現時点での理解度によるものなので、至らない点が多々あるかと思いますが、生暖かい目で見守ってください。

==演算子とequalsメソッドの違いは何か?

⇒同参照か同値かの違いです。
(解説)
Javaの場合、基本データ型参照型があり、String型は参照型です。
==演算子は比較対象の参照オブジェクトが同一かを比較します。 String型の文字列オブジェクトが同値であっても,、==ではインスタンスが別のためfalseと判断します。 equalsメソッドであれば値による比較がおこなれるため、無事trueを返してくれます。
まずは、String型とは何かを把握しなければならない難しい問題の一つですね。
【Java】 そもそもStringって何? | 一番かんたんなJava入門

文字列の+演算子による連結とStringBuilderを使った連結の違いを説明せよ。文字列の連結は原則として+演算子を使ってはならない理由を説明せよ。

⇒+演算子の場合、インスタンスをいくつも生成してしまう。StringBuilderの場合は、単一インスタンスによる文字列連結が可能。
(解説)
+演算子を利用した際、コンパイラによって文字列連結が最適化されるため、StringBuilderインスタンスを生成しappendメソッドを実行することとなります。 不要なインスタンスを生成してしまうため原則として+演算子による連結は良くないとされています。(たぶん
ただ、現状のマシンパワーであれば些細なパフォーマンスの差ですので、単一文章の結合には+演算子を使うことが好ましいとされます。また、ループ処理等により 複数の文章を結合する場合は、StringBuilderを利用することが好ましいとされます。
初心者にだらだら説明するよりも、社内のコーディング規約に則った文字列結合の仕方を教え、「何故、そういう取り決めなのかな?」と思わせると良いのかな?

Listのようにジェネリクス型を使う主たる目的は何か?

⇒戻り値の型を保証するため
(解説)
Listインターフェースに型を明示しない場合、戻り値の型はObject型に補完されます。 例えば、数値を格納するリストとして使いたい場合であれば、取り出して利用する際に数値型にキャストする必要が出てきます。しかし、リストにはオブジェクトであれば何でも値をadd出来るため、 もし文字列が誤って混在した場合、数値型にキャストする部分でエラーとなってしまいます。そういったケースを回避するため、あらかじめ型を定義し、戻り型を保証する必要があります。

オブジェクトがガベージコレクションGC)される主たる条件は何か?

⇒どこからも参照されなくなった時
(解説)
GCVMが勝手に判断して行うものなので、プログラマが介入することは基本的にありません。
オブジェクトのインスタンスはヒープエリアに格納され、ヒープエリアの使用率が一定に昇った時点でどこからも参照されていないインスタンスがあればGCの対象となり、破棄されます。
「newされたインスタンスはエデンに産み落とされる」とか言っておけば出来る子は勝手に調べ始めます。

チェック例外と非チェック例外の違いを型と例外処理の観点で説明せよ。

⇒チェック例外はcatch構文で捕捉、もしくは親元にthrowされる。非チェック例外は意図しないシステムエラー的なもの(笑)
(解説)
ちょっと問題の意図が分かり辛いので適当に答えました。
意図した例外を捕捉したい場合はメンドクサイけどtry~catch構文で捕捉しましょう。

フィールドのアクセス修飾子をprivateにしgetter/setterメソッドを提供する事でフィールドを参照する設計方針を取る主な理由を説明せよ

⇒JavaBeansの規格のため (解説)
答えといて何ですがJavaBeansについては勝手に調べてください。
カプセル化の観点では、フィールドへの直接的なアクセスを提供すると後変更への対応が困難となるので、値の受け渡し用のメソッド(アクセサメソッド)を作成して、 実フィールドは隠ぺいし、保守の効率をあげましょうということになっています。 int型のフィールドにたくさんの場所で値を直接入れてたんだけど、「実はこれBigDecimal型だったんだ~」となった時に全部の場所で値のキャストが必要になってしまう。 しかし、アクセサメソッドを用意しておけばそれを更新するだけで済むんだぜ!?すごいだろ~というお話。

NullPointerExceptionが発生するのは主にどういう状況か?

⇒nullを参照しているオブジェクトやメソッドを呼び出した場合
(解説)
ぬるぽ→ガッってネタは今は通じないようです。
C言語で勉強したポインタのことです。ポインタの実態がなかったり、中身がnullだったりするとこのエラーが発生します。

オーバーロードとオーバーライドの違いは何か?

オーバーロードは引数の値、順序を変えた同名メソッドを定義し振る舞いの違いを実現する。オーバーライドは継承したクラスのメソッドを再定義する。
(解説)
複数の型で引数を取りうるメソッドの場合、オーバーロードを利用することでスッキリとした実装を実現できます。ただし、誤用は避けるようにしてくださいね。
オーバーロードの誤用 - 日々常々
オーバーライドを使うことで、継承した一部機能の変更が出来るようになります。ただし、取りうる引数や戻り値は一緒である必要があり、あくまで内部処理に手を加えたい場合に 利用します。

コンストラクタとは何か?

インスタンス初期化時に実行されるメソッドのようなもの
(解説)
必ずそのオブジェクトを戻り値として返すメソッドのようなものです。オブジェクトの初期化処理を書くことが目的であり、引数を取ることも可能です。前述のオーバーロードを利用して 引数によって初期化処理を変えたりすることも可能。

インターフェイスを利用する目的を1つ説明せよ

⇒仕様から実装を切り離すため (解説)
「このクラスのこのメソッドを利用すると~~という結果を得られます」 といった仕様を策定するのがインターフェースの主な役割です。java初心者に言葉だけで説明するのは非常に難しい問題です。
わかりやすい例えは以下を参考にしてください。(私では無理です
interfaceについて本気出して考えてみた - 都元ダイスケ IT-PRESS
やりたいこと(仕様)があって、様々な実現方法(実装)がある場合にインターフェースを利用するというイメージを持ってもらえるといいと感じました。 また別記事で自分なりの良い例えが書ければなぁって思ったりしています。

まとめ

技術的な言葉を用いれば簡潔に説明出来るのですが、Java初心者に対してわかりやすい説明をするとなると難しいですね。。。
まぁ、詰まる所プログラミングの学習は自主学習に依るところが大きいので、部下に教える際は、口うるさいぐらい検索用のワードを強調することを私は意識しています。 それで指導として適切なのかはまだ私はわかっておりません。。。むむぅ。

では、この辺で失礼致します。

EFFECTIVE JAVA 第2版 (The Java Series)

EFFECTIVE JAVA 第2版 (The Java Series)

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)