タグ付けされた質問 「java」

Javaは、元はSun Microsystemsによって開発された、プラットフォームに依存しない高レベルのオブジェクト指向プログラミング言語です。Javaは現在、2010年にSunを購入したOracleが所有しています。

2
グアバ単体テストはどのように自動的に生成されましたか?
グアバには、自動生成されるユニットテストケースがあります。 グアバには膨大な数の単体テストがあります。2012年7月現在、guava-testsパッケージには286,000を超える個別のテストケースが含まれています。これらのほとんどは、手書きではなく自動的に生成されますが、特にcom.google.common.collectの場合、グアバのテスト範囲は非常に徹底しています。 それらはどのように生成されましたか?それらを設計および生成するためにどのような技術と技術が使用されましたか?

6
到達不能なコードで新しいRuntimeExceptionをスローするのは悪いスタイルですか?
少し前に、より熟練した開発者によって書かれたアプリケーションを保守することになりました。私はこのコードに出会いました: public Configuration retrieveUserMailConfiguration(Long id) throws MailException { try { return translate(mailManagementService.retrieveUserMailConfiguration(id)); } catch (Exception e) { rethrow(e); } throw new RuntimeException("cannot reach here"); } 投げることRuntimeException("cannot reach here")が正当化されるかどうか興味があります。私はおそらく、このコードがより経験豊かな同僚から来ていることを知っている明らかな何かを見逃しています。 編集:ここにいくつかの答えが言及したボディを再スローします。この質問では重要ではないと判断しました。 private void rethrow(Exception e) throws MailException { if (e instanceof InvalidDataException) { InvalidDataException ex = (InvalidDataException) e; rethrow(ex); } if (e …

5
具象メソッドのオーバーライドはコードの匂いですか?
具体的なメソッドをオーバーライドするのはコードの匂いだというのは本当ですか?なぜなら、具体的なメソッドをオーバーライドする必要があると思うからです: public class A{ public void a(){ } } public class B extends A{ @Override public void a(){ } } 次のように書き換えることができます public interface A{ public void a(); } public class ConcreteA implements A{ public void a(); } public class B implements A{ public void a(){ } } BがAでa()を再利用したい場合、次のように書き換えることができます。 public class …

9
クラスを設計して、個々のプロパティではなくクラス全体をパラメータとして取得する
たとえば、広く共有されているクラスと呼ばれるアプリケーションがあるとしUserます。このクラスは、ユーザー、ID、名前、各モジュールへのアクセスレベル、タイムゾーンなどに関するすべての情報を公開します。 ユーザーデータは明らかにシステム全体で広く参照されていますが、何らかの理由で、このユーザーオブジェクトをそれに依存するクラスに渡すのではなく、個々のプロパティを単に渡すようにシステムが設定されています。 ユーザーIDを必要とするクラスは、userIdパラメーターとしてGUID を必要としますが、ユーザー名も必要な場合があります。そのため、別のパラメーターとして渡されます。場合によっては、これは個々のメソッドに渡されるため、値はクラスレベルでまったく保持されません。 Userクラスから別の情報にアクセスする必要があるたびに、パラメーターを追加して変更する必要があり、新しいオーバーロードの追加が適切でない場合は、メソッドまたはクラスコンストラクターへのすべての参照も変更する必要があります。 ユーザーはほんの一例です。これは、コードで広く実践されています。 これはオープン/クローズの原則に違反していると思うのは正しいですか?既存のクラスを変更するだけでなく、そもそもクラスを設定して、将来的に広範囲の変更が必要になる可能性が非常に高くなりますか? Userオブジェクトを渡したばかりの場合は、作業しているクラスに少し変更を加えることができます。パラメータを追加する必要がある場合は、クラスへの参照に数十の変更を加える必要があります。 この慣行によって他の原則が破られていますか?おそらく依存関係の逆転?抽象化を参照しているわけではありませんが、ユーザーは1種類しかないため、ユーザーインターフェイスを持つ必要はありません。 基本的な防衛プログラミングの原則など、違反している他の非ソリッドの原則はありますか? 私のコンストラクタは次のようになります: MyConstructor(GUID userid, String username) またはこれ: MyConstructor(User theUser) 投稿編集: 「パスIDまたはオブジェクト?」で質問に回答することが提案されています。これは、どちらの方向に進むかの決定が、この質問の中心にあるSOLID原則に従う試みにどのように影響するかという質問には答えません。
30 java  c#  design  solid 

4
.equals()がJavaのクラスにあるのに、なぜ.compareTo()がインターフェイスにあるのですか?
クラス内にあるようなメソッド.compareTo()がComparableインターフェイスにある理由を知りたいです。私には、なぜそのようなメソッドがクラスにないのかはarbitrary意的に思えます。.equalsObject.compareTo()Object を使用する.compareTo()には、目的に応じてComparableインターフェイスを実装し、.compareTo()メソッドを実装します。以下のために.equals()、すべてのクラスから継承するため、この方法は、単に、あなたのクラスのメソッドをオーバーライドしObjectたクラス。 私の質問は、なぜ.compareTo()クラスのようなものではなく、実装するインターフェースのようなメソッドなのObjectですか?同様に、実装されるインターフェースではなく.equals()、クラスのメソッドがなぜObjectですか?

6
Javaでの動的コード評価-賢いのか、ずさんなのか?
アプリケーション用にJavaで柔軟なACLフレームワークを作成しようとしています。 多くのACLフレームワークはルールのホワイトリストに基づいて構築されています。ルールはowner:action:resourceの形式です。例えば、 「ジョンはリソースFOOBAR-1を表示できます」 「MARYはリソースFOOBAR-1を表示できます」 「MARYはリソースFOOBAR-1を編集できます」 これは、ルールをデータベースに簡単にシリアル化/永続化できるため魅力的です。しかし、私のアプリケーションには複雑なビジネスロジックがあります。例えば、 「5年以上の年功歴を持つ部門1のすべてのユーザーは、リソースFOOBAR-1を表示できます。それ以外の場合は承認されません」 「部門2のすべてのユーザーは、日付が2016年3月15日以降であれば、リソースFOOBAR-2を表示できます。それ以外の場合は許可されません」 最初に考えたとき、このような無限に複雑なルールを処理できるデータベーススキーマを考案するのは悪夢です。したがって、コンパイルされたアプリケーションにそれらを「焼き付け」、ユーザーごとに評価し、評価の結果としてowner:action:resourceルールを生成する必要があるように思えます。 コンパイルされたアプリケーションにロジックを焼き付けないようにします。 そのため、私はルールを述語:action:resourceの形式で表現することを考えていました。ここで、述語はユーザーが許可されるかどうかを決定するブール式です。述語は、JavaのRhinoエンジンで評価できるJavaScript式の文字列になります。例えば、 return user.getDept() == 1 && user.seniority > 5; そうすることで、述部をデータベースに簡単に永続化できます。 これは賢いですか?これはずさんですか?これはギミックですか?これは過剰に設計されていますか?これは安全ですか(明らかに、JavaはRhinoエンジンをサンドボックス化できます)。

7
メソッドが不正な入力を返すことができないことがわかっている場合でも、メソッド呼び出しの戻り値を検証する必要がありますか?
呼び出しているメソッドがそのような期待を満たしているとわかっていても、メソッドが呼び出した期待値を満たしていることを検証することで、メソッド呼び出しの戻り値に対して防御する必要があるかどうか疑問に思っています。 与えられた User getUser(Int id) { User temp = new User(id); temp.setName("John"); return temp; } 私はすべき void myMethod() { User user = getUser(1234); System.out.println(user.getName()); } または void myMethod() { User user = getUser(1234); // Validating Preconditions.checkNotNull(user, "User can not be null."); Preconditions.checkNotNull(user.getName(), "User's name can not be null."); System.out.println(user.getName()); } …

1
Java 8の型推論
Java 8 での新しいラムダ表記(たとえば、この記事を参照)の導入には、ある種の型推論が必要になりますか? もしそうなら、新しい型システムはJava言語全体にどのような影響を与えますか?

2
低レイテンシJavaの記述[終了]
Javaで低レイテンシコードを記述するためのJava固有の手法(C ++には当てはまらないもの)はありますか?私はJavaの低レイテンシーの役割をよく見ますが、彼らは低レイテンシーのJavaを書いた経験を求めます。 私が考えることができる唯一の考えは、JNIの経験、ネイティブコードへのI / O呼び出しのアウトソーシングです。また、場合によってはディスラプターパターンを使用しますが、それは実際のテクノロジーではありません。 低レイテンシコードを記述するためのJava固有のヒントはありますか? リアルタイムJava仕様があることは承知していますが、リアルタイムは低遅延と同じではないと警告されています。

5
返品後に作業を行うためのfinally節の使用は、スタイルが悪い/危険ですか?
イテレーターの作成の一環として、次のコードを作成していることに気付きました(エラー処理を削除) public T next() { try { return next; } finally { next = fetcher.fetchNext(next); } } 読むよりもやや読みやすい public T next() { T tmp = next; next = fetcher.fetchNext(next); return tmp; } 私はそれが読みやすさの違いがそれほど圧倒的ではないかもしれない単純な例であることを知っていますが、例外が含まれていないこのような場合にtry-finallyを使用するのが悪いかどうかについての一般的な意見に興味がありますコードを簡素化するときに実際に優先される場合。 悪い場合:なぜ?スタイル、パフォーマンス、落とし穴、...? 結論 あなたのすべての答えに感謝します!(少なくとも私にとって)結論は、最初の例は一般的なパターンであれば読みやすかったかもしれないが、そうではないということだと思います。そのため、目的外の構造を使用することで生じる混乱と、場合によっては難読化された例外フローが、単純化よりも重要になります。

5
Groovyはなくなりますか?[閉まっている]
この質問は何度も聞かれたと思います。しかし、私はこれらの言語の将来は何であるかという意図を持ってもう一度尋ねたいです。 私は最初にGroovyを紹介され、本当に気に入っていました。構文がよりシンプルで、Javaにはるかに近いと感じ、Grailsをすばやく学習することができました。 それからScalaがあり、ウェブフレームワークはLiftです。私はまだScalaを学んでおり、時には構文が非常に難しいと感じています。 しかし、Groovyの将来はどうなるのか、まだ疑問に思っています。Groovyの作者が、Scalaを知っていればgroovyを作成したことはなかったと言ったとき、未来があるのではないかと思うようになります。もちろん、Groovyは大きな進歩を遂げており、Grailsは今日多くの大企業で使用されています。 もし今日Grails対Liftを見るとすれば、Grailsが勝者になります。より多くの企業がそれを使用しています。しかし、これまで述べてきたことをすべて考えると、Groovyに投資すべきかどうか知りたいと思いますか?Groovyは廃止され、Scalaはより良い選択ですか?BMWのCEOがメルセデスを運転すると言ったら、なぜ私たち全員がメルセデスも運転してはいけないのか疑問に思うでしょう。 (この質問が本当に広範で、閉じられている可能性があるかどうかは理解しています。しかし、他の人のためのオープンなWikiにしたいと思っています。)
30 java  scala  groovy  grails 

3
Closures / Lambdas /…に対するC#、Java、Scalaのアプローチのメリットとデメリットは何ですか?
Project Lambda(JSR 335)のメーリングリストに送信されたBrian Goetzの電子メールPeek Past lambdaで表明された実装のアイデアと懸念と、C#とScalaの技術的な実装の違いは何ですか? メールから: 「たぶんラムダは単に内部クラスのインスタンスであるべきで、それは本当にシンプルだろう」という道を探りましたが、最終的には「関数は言語の未来にとってより良い方向である」という立場になりました。 そしてさらに: 世界のオブジェクトであるラムダは、この将来の可能性と矛盾しています。ラムダは関数の世界観ではありません。この柔軟性を維持することは、ラムダにオブジェクト性の外観でさえ負荷をかけないことを支持するポイントの1つです。 結論: Lambdas-are-functionsはドアを開きます。Lambdas-are-objectsはそれらを閉じます。 これらのドアが開いたままになるのを好む。 また、Redditスレッドのユーザーからのコメントは次のとおりです。 私は実際にこれについてNeal Gafterにメールしました。彼の説明についての私の限られた理解では、C#と現在のJavaデザインは、デリゲートは実際にはオブジェクトであり、関数型ではありません。JavaはC#のラムダの短所から学び、それらを避けるべきだと彼は信じているようです(C#がJavaの短所から学び、最初にそれらを避けたように)。 「Lambdas-are-functions」アプローチが「Lambdas-are-objects」よりも多くの機会を将来可能にするのはなぜですか?誰かがどのような違いが存在し、それらがコードの記述方法にどのように影響するかを説明できますか? Scalaの物事が「うまくいく」ことを見て、C#/ Java(8)で採用/提案されているアプローチについて何かが欠けていると考え続けています。
30 c#  java  scala  lambda  closures 

8
現実の世界で「強力な」型システムを使用しているのは、たとえば大規模なWebアプリの場合ですか?
これは非常に広く、曖昧で、おそらく哲学的な質問であることを知っています。質問の中で最も重要なキーワードである「強力な」タイプのシステム自体は、ある程度不明確です。だから、私が意味することを説明しようとさせてください。 質問の全体的なコンテキスト 私たちはRuby on Railsで非常に大規模なWebアプリを構築してきましたが、私たちは一般的にスタックに満足しています。必要に応じて、ものを非常に高速に出荷できます-約10%のエッジケースをあまり心配することなく、「ビジネス」ケースの90%で機能するものです。一方、コードレビューとテストカバレッジの助けを借りて、ゆっくりと慎重になり、すべてのベースをカバーするようにすることができます-再び、そのような綿密な調査と安全に値する状況でのみ。 しかし、チームが成長するにつれて、スタックに焼き付けられた「セーフティネット」の欠如に不快感を覚え始めました。 最近、JavaでAndroidのネイティブ開発を開始しました。そして、私はコンパイルされた/静的な/強く型付けされた言語によって提供される安全性を(心地よく)思い出しました。 変数のつづりが間違っている、データ型が間違っている、関数の呼び出しが正しくない、些細なエラーがIDE自体でキャッチされます。IDEがコンパイラにフックして、プログラムの「正確性」の特定の側面を検証できるためです。 関数シグネチャを変更する必要がありますか?簡単です。コンパイラ+ IDEは、すべての呼び出しサイトを見つけるのに役立ちます。 特定の例外が常に処理されるようにする必要がありますか?あなたの救助のチェックされた例外。 現在、これらの安全機能には利点がありますが、それらの欠点もよく知っています。さらに、「ボイラープレートヘビー」Javaの世界では。したがって、Javaの代わりに、私は人々が最近作業を開始した多数の現代の「強く型付けされた」言語を見始めました。例:Scala、Rust、Haskellなど。私が最も興味を持っているのは、型システムと静的/コンパイル時チェックの力です。 さて、質問 これらの強力な型システムと静的/コンパイル時機能を大規模なアプリケーションで使用するにはどうすればよいですか? たとえば、これらの強力な機能の標準的な「hello world」のような紹介を超えてどのように移行するのでしょうか リッチタイプシステムを使用してビジネスドメインの問題をモデル化するものはありますか?タイプシステムは、30,000 LOC +ゾーンにいるときに役立ちますか、それとも妨げになりますか?システムが弱く型付けされた外の世界と対話するとき、これらの型システムによって提供されるセーフティネット(およびコンパイル時チェック)に何が起こるか。JSONまたはXML API、さまざまなデータストア、ユーザー入力などを介して

10
Javaのテンプレート「メタプログラミング」は良いアイデアですか?
非常にパフォーマンスに敏感ないくつかの関数(1秒あたり数百万回と呼ばれる)を持つかなり大きなプロジェクトにソースファイルがあります。実際、以前のメンテナーは、1つの関数で条件のチェックに費やす時間を節約するために、それぞれわずかに異なる関数のコピーを12個書くことにしました。 残念ながら、これはコードが維持するPITAであることを意味します。重複するコードをすべて削除し、テンプレートを1つだけ作成したいと思います。ただし、Java言語はテンプレートをサポートしていないため、ジェネリックがこれに適しているかどうかはわかりません。 私の現在の計画は、代わりに関数の12個のコピーを生成するファイル(実際には1回限りのテンプレート拡張機能)を書くことです。もちろん、ファイルをプログラムで生成する必要がある理由については、豊富な説明を提供します。 私の懸念は、これが将来のメンテナーの混乱につながり、変更後にファイルを再生成するのを忘れると厄介なバグを引き起こす可能性があることです。残念ながら、C ++ですべてを書き直すまで、これを修正する方法はありません。 このアプローチの利点は欠点を上回っていますか?代わりに: パフォーマンスに打撃を与え、単一の保守可能な機能を使用します。 関数を12回複製する必要がある理由の説明を追加し、保守の負担を丁寧に負担します。 ジェネリックをテンプレートとして使用することを試みます(それらはおそらくそのようには動作しません)。 単一の関数にコードをパフォーマンスに依存させるという古いメンテナーに大声で叫ぶ。 パフォーマンスと保守性を維持する他の方法は? PSプロジェクトの設計が貧弱であるため、関数のプロファイリングはかなりトリッキーです...しかし、前のメンテナーは、パフォーマンスの低下は許容できないと私に確信させました。これは彼が5%以上を意味すると思いますが、それは私の側の完全な推測です。 おそらく少し詳しく説明する必要があります。12個のコピーは非常によく似たタスクを実行しますが、わずかな違いがあります。違いは関数全体のさまざまな場所にあるため、残念ながら多くの条件文があります。事実上、6つの操作の「モード」と2つの操作の「パラダイム」があります(自分で作成した単語)。関数を使用するには、操作の「モード」と「パラダイム」を指定します。これは決して動的ではありません。コードの各部分は、厳密に1つのモードとパラダイムを使用します。12のモードパラダイムペアはすべて、アプリケーションのどこかで使用されます。これらの関数には、func1〜func12という適切な名前が付けられ、偶数が2番目のパラダイムを表し、奇数が最初のパラダイムを表します。 保守性が目標であれば、これは最悪の設計であることを認識しています。しかし、それは「十分に速い」と思われ、このコードはしばらく変更を必要としませんでした...元の関数が削除されていないことにも注意する価値があります(ただし、私が知る限り、それはデッドコードです) 、したがって、リファクタリングは簡単になります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.