「//fix this/」の記事インデックス

//fix this/ Javaコードの間違いをさがせ!


このシリーズは、あなたのコーディング・スキルを試すコーナーです。毎号オラクルのJavaエバンジェリストたちが、Javaコードに関する難問を出題し、正解と解説を掲載します。是非、毎号チャレンジして貴方のコーディング能力の向上にお役立て下さい。


第6回目 (Java Magazine 2013/Jan-Febからの出題)


1. 今回のテーマ 「CLDC」 

今回は組み込みに関する問題です。Connected Device Configuration(CDC)とConnected Limited Device Configuration(CLDC)はコネクタ・フレームワークを使用して、最小フットプリントのAPIを介した汎用入力および出力をサポートしています。CDCはOracle Java ME Embedded Clientの基盤であり、CLDCはOracle Java ME Embeddedの基盤です。


次の例では、DatagramConnectionを使用して、クライアントからのメッセージをリスンし、処理するサーバーをセットアップしています。メッセージ長は可変ですが、256バイトを超えることはありません。アプリケーションを実行すると、一部のメッセージは全体を取得するために複数回の読取りが必要になります。

 



2. コード

すべてのメッセージを1回のgetData()呼出しで読み取るには、どのようにコードを変更すればよいですか。


datagram = connection.newDatagram(256);

 while (notDone) {
    connection.receive(datagram);
    data = datagram.getData();
    bytesReceived = datagram.getLength();
    // process datagram ...
 }

3.正しいのはどれ?

上記のコードについて、正しい修正方法を選んでください。

1) コネクションのタイプがUDPDatagramConnectionであることを確認する

2) connection.newDatagramの呼出しをwhileループの内側に移動する

3) connection.receive()を呼び出す前に、datagram.reset()の呼出しを追加する

4) connection.receive()を呼び出す前に、datagram.setLength(256)の呼出しを追加する

<ヒント>
データ構造がどのように再利用されるかを考えましょう。






【答え】

正解は 4)です。データグラムの長さを 256 バイトにリセットすることで、最大長のメッセージを保持するための十分な長さを確保します。 データグラムを再利用するため、この方法がもっとも効率的なソリューションであり、リソースに制約がある組込みデバイスに最適です。

1)はデータグラムの長さの処理方法とは関係ないため、不適切です。2)を選ぶと、取得のたびにデータグラムの新規インスタンスが作成されるため問題は解決するでしょう。 しかし、組込みシステムではメモリおよび処理の効率を重視する必要があるため、厳密に言うと、ここでは不正解です。 3 )はデータグラムの読取りポインタをリセットして最初に戻しますが、データグラムの長さには関係ありません。


<< 第5回へ戻る I 第7回へ進む >>

「//fix this/」の記事インデックス