beroの日記: Javaプログラマであるかを見分ける10の質問 に非Javaプログラマが答えてみる 2
俺はJavaをまともに使ったことはないんだが、80%位は答えられたかな?
- ==演算子とequalsメソッドの違いは何か?
オブジェクトの場合、==は同一性、equalsは同値性を比較する
- 文字列の+演算子による連結とStringBuilderを使った連結の違いを説明せよ。
新しいバージョンでは最適化されて同じになるので違いはない。
ただしループ中でたくさん連結するような場合は(最適化の度合いによっては)明示的にStringBuilderを使ったほうが良い。
#という噂ではあるが逆汗して確認したことはない。
s = s + s1 + s2
s = (new StringBuilder(s)).append(s1).append(s2).toString()
#1文なら同じだが、ループ中だと最初のnew StringBuilderと最後のtoString()はループ外に出したほうが良いだろう。
#このくらいコンパイラ(javacまたはJITのどちらかは問わず)でやってそうなもんだが、実際は知らない。
- Listのようにジェネリクス型を使う主たる目的は何か?
Interger以外のオブジェクトが入るのを防ぎ、キャストが不要になり、それに伴うミスの混入を防ぐ
# Integerだとintとのboxing/unboxingも利点かもしれんがJavaで出来るかどうかうろ覚え(C#はできたはず)。
# まあ「のように」とあるからジェネリクス全般の質問だろうから書かない。
- オブジェクトがガベージコレクション(GC)される主たる条件は何か?
ヒープがいっぱいになったとき
どこからも参照されなくなったとき
#循環参照の扱いは知らんがGCはJavaで最も研究が進んだ分野の一つだから対処してないはずがない
- チェック例外と非チェック例外の違いを型と例外処理の観点で説明せよ。
しらね(後述)
-フィールドのアクセス修飾子をprivateにしgetter/setterメソッドを提供する事でフィールドを参照する設計方針を取る主な理由を説明せよ
実装を隠蔽して変更可能にするため。例えば内部に対応するフィールドをもつのではなく、getterで計算で出したり別オブジェクトを参照したりできる。
#のであるが隠蔽出来さえすれば逆に普通のフィールドアクセスのように記述すると内部でgetter/setterメソッドを呼ぶというJavaScriptやRubyのような言語仕様もありなので、こっちのが好みかな
- NullPointerExceptionが発生するのは主にどういう状況か?
Nullを返す可能性のあるAPIを使い、チェックせずそのまま(オブジェクト操作などに)使ったとき
- オーバーロードとオーバーライドの違いは何か?
オーバーロード -> 同じ名前の(引数の数や型が)違うメソッド。
オーバーライド -> 子クラスで親クラスと挙動を変えるための親クラスと同じシグネチャ(引数の数や型)のメソッド
- コンストラクタとは何か?
newしたときに初期化するためのメソッド
- インターフェイスを利用する目的を1つ説明せよ
ある機能をもった(実装やふるまいの異なる)メソッドを呼びたい時、子クラスのオーバーライドではなくインターフェイスを使うとクラス階層を限定せずに利用出来る
----
Javaプログラマでなくても答えられるから悪い設問、というわけではなくて、
「Javaプログラマであるかを見分ける10の質問」というか正確には「Javaプロジェクトに追加投入する人材のスキルチェック」らしいので、COBOLライクなJavaプログラムよりOOを理解した他言語プログラマのほうが望ましい、という意図なんでしょう。
チェック例外ちょっと調べてみたら、
- 例外処理を書くのが必須(コンパイルが通らない)なのがチェック例外、書かなくてもいいのが非チェック例外 =いいかげんな視点
- 非チェック例外型(RuntimeException等)の子クラスが非チェック例外、それ以外がチェック例外
チェック例外のへんは議論百出というか喧々諤々というか
フレームワークでチェック例外を握りつぶして非チェック例外にしてる(から上位レイヤでは知らなくてよし)のもあるみたいだな
文字列の連結 (スコア:0)
まず教科書的に答えて、場合によっては最適化が期待できる事を付け加えるのがベストかと。
現場的にはループ内以外で、+での連結が大問題になるケースってあまり無い気がしますけどね。
そのメソッドが頻繁に呼ばれるかどうかはある程度想像できますし。
Re:文字列の連結 (スコア:1)
String (Java Platform SE 6) [sun.com]
Java言語仕様
上記はOracleJava実装(OracleにはJRockitもあるので紛らわしいな。なんて呼べばいいんだ?)とJava言語仕様の記述。
教科書的(仕様書的)には「処理系依存」って回答になるんですかね