パスワードを忘れた? アカウント作成
304519 journal

beroの日記: Javaプログラマであるかを見分ける10の質問 に非Javaプログラマが答えてみる 2

日記 by bero

Javaプログラマであるかを見分ける10の質問

俺は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等)の子クラスが非チェック例外、それ以外がチェック例外
チェック例外のへんは議論百出というか喧々諤々というか
フレームワークでチェック例外を握りつぶして非チェック例外にしてる(から上位レイヤでは知らなくてよし)のもあるみたいだな

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2011年03月07日 22時16分 (#1914006)
    元の質問でも突っ込まれているポイントではありますが、特にこれは採用面接を想定しているわけですし、
    まず教科書的に答えて、場合によっては最適化が期待できる事を付け加えるのがベストかと。

    現場的にはループ内以外で、+での連結が大問題になるケースってあまり無い気がしますけどね。
    そのメソッドが頻繁に呼ばれるかどうかはある程度想像できますし。
    • by bero (5057) on 2011年03月09日 16時04分 (#1915055) 日記

      String (Java Platform SE 6) [sun.com]

      Java 言語は、文字列連結演算子 ( + )、およびその他のオブジェクトから文字列への変換に対する特別なサポートを提供します。文字列連結は StringBuilder (または StringBuffer) クラスとその append メソッドを使って実装されています。文字列変換は Object によって定義された toString メソッドを使って実装され、Java のクラスすべてによって継承されます。文字列連結および文字列変換についての詳細は、Gosling、Joy、および Steele による『Java 言語仕様』を参照してください。

      Java言語仕様

      15.17.1 文字列連結演算子 + [y-adagio.com]

      結果は二つのオペランドの文字列を連結して新たに作成したオブジェクト String への参照とする。

      15.17.1.2 文字列連結の最適化
      処理系は中間的なオブジェクトStringの作成及び廃棄を避けるために,変換及び連結を一段階で実行してもよい。Javaコンパイラは,繰り返される文字列連結の性能向上を目的として,式の評価によって作成される中間的なオブジェクト String の数を減らすために,クラス StringBuffer(20.13) 又は同様な技術を使用してもよい。

      上記はOracleJava実装(OracleにはJRockitもあるので紛らわしいな。なんて呼べばいいんだ?)とJava言語仕様の記述。

      教科書的(仕様書的)には「処理系依存」って回答になるんですかね

      親コメント
typodupeerror

海軍に入るくらいなら海賊になった方がいい -- Steven Paul Jobs

読み込み中...