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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

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

Q&A

解決済

3回答

193閲覧

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

Cpin0312

総合スコア5

Java

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

2グッド

0クリップ

投稿2018/05/17 01:15

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を実装する方法を探しています、こっちの実装方法を知っている人も良かったら教えてくれませんか?

Do_you_1isten👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

投稿2018/05/17 01:26

m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Cpin0312

2018/05/17 01:49

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

0

ベストアンサー

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

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

投稿2018/05/17 01:25

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Cpin0312

2018/05/17 01:50

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

2018/05/17 01:52

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

2018/05/17 02:16

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

0

他の方の回答どおりで@...はアノテーションといいます。「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的操作を行うためのラッパーを用意する必要があろうかと思います。

java

1var list = new ArrayList<String>(); 2list.map(...).filer(...)... //拡張メソッドが書けないのでこのようには逆立ちしても書けない 3 4 5// Java8ではLinq的ラッパーはjava.util.stream.Streamだがそれへの変換メソッドがあちこちにある 6 7var list = new ArrayList<String>(); 8list.stream().map(...).filter(...)...; 9var array = new String[] { ... }; 10Arrays.stream(array).map(...).filter(...)...; 11 12// 自前でLinq的操作を設計するならこんなふうにするのかな 13var list = new ArrayList<String>(); 14Linq.of(list).map(...).filter(...)...

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

  • Genericsの型引数にプリミティブ型が直接指定できない

JVM言語(ScalaとかKotlinとか)はこれサポートしてるのでJavaの使いづらい点としてずーっと課題になっているのではないかと思います。

  • 検査例外の仕様が関数オブジェクトの「型の違い」となってインターフェースの違いに現れるので煩雑

このあたりswiftなどだとスマートですよね・・・。検査例外なんていらないという言語(C#とか)だと気にしなくてよいのですが。

投稿2018/05/17 02:08

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Cpin0312

2018/05/17 02:23

詳しくな説明ありがとうございます! 今さら気づいたけれど、確かにC#の[] とJavaのアノテーションは似ています。 また JavaにLinqを実装する件ですが、ネットで https://qiita.com/kasecato/items/ec7ab8b392fa8bb0a732 を見つかったけれど、実際にはうまくいけない時もあるということでしょうか?
KSwordOfHaste

2018/05/17 02:28 編集

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

2018/05/17 02:48

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

2018/05/17 03:13 編集

なるほどちょっと勘違いしてました。「JavaにLinqを実装する方法」とあったので自分で実装しようという話かと思いましたが「JavaでもLinqを使いたい」ということなのですね? もしそうなら「充分デバッグされたライブラリーならどちらを使ってもかまわない」と思います。実際にこのライブラリーがどのくらいの品質かは自分にはわかりません。GitHubに公開されているのでそこからライブラリーがメンテされているかや問題点はそれなりに見えると思います。 あと一緒に使うライブラリーとの親和性なんかは必要に応じて考えた方がいいかも知れません。GitHubを見るとラッパーではなくList, Set, Dictionaryの3つの具象クラスに限定してLinqをサポートしたもののようですがなぜかDictionaryは今は推奨されてないjava.util.Dictionaryが使われています。Mapを要求する場所には使えないことになりますよね。なぜこうしたのかな・・・自分にはわかりませんでした。
Cpin0312

2018/05/17 04:31

日本語はまだ勉強中ですので、【JavaでもLinqを使いたい】の方が正しいです。 承知しました。確かにC#ではDictionaryをMap(Select)できるのは普通だと思いますが,qiitaのLinqでは実行できるかどうかがテスト必要と言うことですね。 分かりました。これから確認してみます。 いろいろ教えてくれて、ありがとうございました。
KSwordOfHaste

2018/05/17 04:42

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

2018/05/17 05:14

あ!分かりました。最初はStreamのmapに勘違いました。Mapという連想配列は知りませんでした。 MapはDictに似ていますが、JavaでMapの方を推奨しています。 ※おそらくこのLinQはC#のままを真似したため、Dictの方を作りました。 JavaのDictを取得するときに使えるがそもそもJava自体がDictを推奨していません。 でも推奨するMapを取得する際に、このLinQのメソッドは使えません。 認識は合っていますか?
Cpin0312

2018/05/17 06:02

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問