質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • Java

    14376questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Javaの基本知識を教えていただきたいです。

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 306

Cpin0312

score 1

Javaを勉強中プログラマーです。

今までずっと気になるところがあって、よかったら教えてくれませんか?

 質問

@Override
public TSource get(Object key) {
  return dictionary.get(key);
}
②
@SuppressWarnings("Duplicates")

③
public static void main(String[] args) throws Exception
{
    entityManagerFactory = Persistence.createEntityManagerFactory("JPATest");
    SampleDbCreator.createDatabase(entityManagerFactory);
    streams = new JinqJPAStreamProvider(entityManagerFactory);
    streams.registerAssociationAttribute(Lineorder.class.getMethod("getItem"), "item", false);
    streams.registerAssociationAttribute(Lineorder.class.getMethod("getSale"), "sale", false);
    streams.setHint("queryLogger", new JPAQueryLogger() {
    @Override public void logQuery(String query, Map<Integer, Object> positionParameters,Map<String, Object> namedParameters)
     {
        System.out.println("  " + query);
     }
    });
    new SampleMain().runSampleQueries();
}


上記の場合だと、【@】の意味は何ですか?
今見たところはDB関係も使われています。
コメントの意味ですか?あるいはDB項目ですか?

[xxx]
private void sample(){}


サンプルを見つらなくて、こんな感じのソースもたまに見かけます。
[]はなんのため使いますか?

いまだに書いたことがないので、よかったら教えてください。

 補足情報

サイトだけを教えてもかまいません。
今はJavaにLinqを実装する方法を探しています、こっちの実装方法を知っている人も良かったら教えてくれませんか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

まず、Javaの@***は、アノテーションといいます。ライブラリによっては自前のアノテーションを用意してあることもありますが、@Override@SuppressWarningは、言語標準で用意してあるアノテーションです。

  • @Override…親クラスやインターフェースのメソッドを実装することを宣言する。型が違うなどで、正しくオーバーライドされていないときはコンパイルエラーになるほか、逆にIDEなどではアノテーションなしでオーバーライドすると警告が出ることもある。
  • @SuppressWarning…その名の通り、指定された警告を抑制する。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/17 10:50

    ありがとうございます!
    アノテーションについて、調べましたが、@Override, @SuppressWarningはよく使えるだと思います。
    それ以外はまだ理解できていません。

    キャンセル

  • 2018/05/17 10:52

    それ以外のは、「ライブラリが提供するアノテーション」ということも考えられますので、ライブラリのリファレンスから調べる必要があるかもしれません。

    キャンセル

  • 2018/05/17 11:16

    承知いたしました。
    自作のアノテーションも可能と知っていましたので、そこについても今後注意します。

    キャンセル

+2

「アノテーション」で調べてみてください。
疑問の幾つかは理解につながると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/17 10:49

    ありがとうございます!
    アノテーションについて、調べましたが、@Override, @SuppressWarningはよく使えるだと思います。
    それ以外はまだ理解できていません。

    キャンセル

+1

他の方の回答どおりで@...はアノテーションといいます。「Java アノテーション」で探すと情報が得られるでしょう。

[]はおそらくC#のソースを見たのでしょう。これはAttributeと呼ばれJavaにおけるアノテーションに似た役割を持つものです。

アノテーションにせよAttributeにせよ指定した言語要素(クラスやらメソッドやら)に言語仕様で規定されていないメタな情報を付与することを可能とする機構です。どちらも実行時にリフレクションを用いることでメタ情報を参照できますが、Javaのアノテーションはアノテーションプロセッサーを書けばコンパイル時に元のコードを改変するようなこともできます(ゲッターやセッターを生成したりといったこと)。C#ではSystem.Diagnostics.Conditionalのような定義済みのAttributeでは生成コードを変更するようなこともできますが自前でコンパイル時に(MSBUILDタスクを追加するといった方法で)どこまでできるのか自分にはわかりません。

JavaにLinqを実装する

C#のLinqに相当する機能はJava8でサポートされたjava.util.stream.Streamがあります。これが参照実装になろうかと思います。独自なものも定義できますがJavaにはextension methodを定義する機構がない(つまり既存のインターフェースやクラスを拡張できない)のでC#のLinq相当のものをまともに作るなら少なくとも既存のCollectionフレームワーク(java.utilのクラス・インターフェース群)や配列に対してLinq的操作を行うためのラッパーを用意する必要があろうかと思います。

var list = new ArrayList<String>();
list.map(...).filer(...)... //拡張メソッドが書けないのでこのようには逆立ちしても書けない


// Java8ではLinq的ラッパーはjava.util.stream.Streamだがそれへの変換メソッドがあちこちにある

var list = new ArrayList<String>();
list.stream().map(...).filter(...)...;
var array = new String[] { ... };
Arrays.stream(array).map(...).filter(...)...;

// 自前でLinq的操作を設計するならこんなふうにするのかな
var list = new ArrayList<String>();
Linq.of(list).map(...).filter(...)...

ただJavaにはmethod拡張ができない以外にもLinq的なものをサポートするのに都合がわるい仕様がいろいろありちょっと悩ましいことになると思います。

  • Genericsの型引数にプリミティブ型が直接指定できない
    JVM言語(ScalaとかKotlinとか)はこれサポートしてるのでJavaの使いづらい点としてずーっと課題になっているのではないかと思います。
  • 検査例外の仕様が関数オブジェクトの「型の違い」となってインターフェースの違いに現れるので煩雑
    このあたりswiftなどだとスマートですよね・・・。検査例外なんていらないという言語(C#とか)だと気にしなくてよいのですが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/17 11:23

    詳しくな説明ありがとうございます!
    今さら気づいたけれど、確かにC#の[] とJavaのアノテーションは似ています。

    また
    JavaにLinqを実装する件ですが、ネットで
    https://qiita.com/kasecato/items/ec7ab8b392fa8bb0a732
    を見つかったけれど、実際にはうまくいけない時もあるということでしょうか?

    キャンセル

  • 2018/05/17 11:28 編集

    悩ましいのは確かだと思います。
    qiitaの記事をざっとみただけですがGenericsについてはプリミティブを扱えないことは気にしてないように見えます。検査例外の仕様も同様に気にしてないように見えます。要するにjava.util.stream.Streamが持つ制約そのまま品揃えを拡張する点を主眼にしたということかと思います。

    キャンセル

  • 2018/05/17 11:48

    やはりバグなど未知の問題を発生させないため、既存のStreamを使用するほうが良いのことですか?
    最初はC#とJavaScriptも同じようなLinQをうまく実行できたが、Javaのほうが多少難しいですか?
    (プリミティブ型や検査例外により予測外のことを発生するとか)
    認識が間違ったら、大変申し訳ありません。

    キャンセル

  • 2018/05/17 12:12 編集

    なるほどちょっと勘違いしてました。「JavaにLinqを実装する方法」とあったので自分で実装しようという話かと思いましたが「JavaでもLinqを使いたい」ということなのですね?

    もしそうなら「充分デバッグされたライブラリーならどちらを使ってもかまわない」と思います。実際にこのライブラリーがどのくらいの品質かは自分にはわかりません。GitHubに公開されているのでそこからライブラリーがメンテされているかや問題点はそれなりに見えると思います。

    あと一緒に使うライブラリーとの親和性なんかは必要に応じて考えた方がいいかも知れません。GitHubを見るとラッパーではなくList, Set, Dictionaryの3つの具象クラスに限定してLinqをサポートしたもののようですがなぜかDictionaryは今は推奨されてないjava.util.Dictionaryが使われています。Mapを要求する場所には使えないことになりますよね。なぜこうしたのかな・・・自分にはわかりませんでした。

    キャンセル

  • 2018/05/17 13:31

    日本語はまだ勉強中ですので、【JavaでもLinqを使いたい】の方が正しいです。

    承知しました。確かにC#ではDictionaryをMap(Select)できるのは普通だと思いますが,qiitaのLinqでは実行できるかどうかがテスト必要と言うことですね。

    分かりました。これから確認してみます。
    いろいろ教えてくれて、ありがとうございました。

    キャンセル

  • 2018/05/17 13:42

    > Linqでは実行できるかどうかがテスト必要
    いえ、qiitaのライブラリーにはDictionaryというクラスがあって、それを使えばLinqを使えます。しかしこのクラスの基底クラスはjava.util.Dictionaryです。
    Javaでの「連想配列」の標準はjava.util.Mapで、java.util.Dictionaryは推奨されてません。
    推奨されてないだけで別にjava.util.Dictionaryやその派生クラス(QiitaのLinqライブラリー)を使ったってかまわないのです。しかしjava.util.Mapを要求するようなメソッドへはこのDictionaryはそのまま渡せませんよということです。

    キャンセル

  • 2018/05/17 14:14

    あ!分かりました。最初はStreamのmapに勘違いました。Mapという連想配列は知りませんでした。
    MapはDictに似ていますが、JavaでMapの方を推奨しています。
    ※おそらくこのLinQはC#のままを真似したため、Dictの方を作りました。

    JavaのDictを取得するときに使えるがそもそもJava自体がDictを推奨していません。
    でも推奨するMapを取得する際に、このLinQのメソッドは使えません。

    認識は合っていますか?

    キャンセル

  • 2018/05/17 14:16

    合ってると思います。

    キャンセル

  • 2018/05/17 15:02

    なんかすっきりしました。ありがとうございます。

    キャンセル

同じタグがついた質問を見る

  • Java

    14376questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。