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

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

5
ORMはリッチドメインモデルの作成を可能にしますか?
私のほとんどのプロジェクトでHibernateを約8年間使用した後、私はその使用を思いとどまらせ、ストアドプロシージャを介してのみDBと対話するアプリケーションを求めている会社に行きました。 数週間これを行った後、私が構築し始めているアプリケーションのリッチドメインモデルを作成することができず、アプリケーションは(恐ろしい)トランザクションスクリプトのように見えます。 私が発見した問題のいくつかは次のとおりです。 ストアドプロシージャは最小量のデータを読み込むだけなので、オブジェクトグラフをナビゲートすることはできません。つまり、フィールドが異なる類似したオブジェクトがある場合があります。たとえば、顧客からすべてのデータを取得するストアドプロシージャと、顧客からアカウント情報といくつかのフィールドを取得するストアドプロシージャがあります。 多くのロジックは最終的にヘルパークラスになるため、コードはより構造化されます(エンティティは古いC構造体として使用されます)。 ストアドプロシージャから結果セットを抽出し、エンティティに配置するフレームワークがないため、より退屈な足場コード。 私の質問は: 誰もが同様の状況にあり、ストアプロシージャアプローチに同意しませんでしたか?あなたは何をした? ストアドプロシージャを使用する実際の利点はありますか?「誰もドロップテーブルを発行できない」という愚かな点は別として。 ストアドプロシージャを使用してリッチドメインを作成する方法はありますか?オブジェクトグラフをナビゲートできるように、AOPを使用してエンティティにDAO /リポジトリを挿入する可能性があることを知っています。ブードゥー教に非常に近いので、このオプションは好きではありません。 結論 まず、答えてくれてありがとう。私が到着した結論は、ORMは(一部の人が述べたように)リッチドメインモデルの作成を有効にしないが、(多くの場合繰り返し)作業の量を単純化するということです。以下は結論のより詳細な説明ですが、ハードデータに基づいていません。 ほとんどのアプリケーションは、情報を要求して他のシステムに送信します。これを行うには、モデル用語で抽象化(ビジネスイベントなど)を作成し、ドメインモデルがイベントを送受信します。通常、イベントにはモデルからの情報の小さなサブセットが必要ですが、モデル全体ではありません。たとえば、オンラインショップでは、支払いゲートウェイはユーザーに請求するためにユーザー情報と合計を要求しますが、購入履歴、利用可能な製品、およびすべての顧客ベースは必要としません。そのため、イベントには小規模で特定のデータセットがあります。 アプリケーションのデータベースを外部システムとして使用する場合は、ドメインモデルエンティティをデータベースにマッピングできる抽象化を作成する必要があります(NimChimpskyが言及したように、データマッパーを使用)。明らかな違いは、各モデルエンティティのデータベース(レガシースキーマまたはストアドプロシージャ)へのマッピングを手作業で作成する必要があることです。2つは同期していないため、1つのドメインエンティティが部分的にマッピングされる可能性がありますデータベースエンティティ(たとえば、ユーザー名とパスワードのみを含むUserCredentialsクラスが他の列を持つUsersテーブルにマップされる)、または1つのドメインモデルエンティティが複数のデータベースエンティティにマップされる場合があります(たとえば、1対1の場合テーブルに1つのマッピングがありますが、1つのクラスにすべてのデータが必要です)。 エンティティが少数のアプリケーションでは、エンティティを横断する必要がない場合、追加の作業量は少ないかもしれませんが、エンティティを横断する条件付きの必要がある場合は増加します(したがって、ある種の「怠lazな」読み込み」)。アプリケーションが成長してより多くのエンティティを持つようになると、この作業は増加するだけです(そして、非線形に増加すると感じています)。ここでの私の仮定は、ORMを再発明しようとしないことです。 DBを外部システムとして扱うことの利点の1つは、アプリケーションの2つの異なるバージョンを実行し、各アプリケーションのマッピングが異なる状況を回避できることです。これは、本番環境への継続的な配信のシナリオでより興味深いものになります...しかし、これは、ORMでもそれほどではないかもしれません。 開発者は、データベースにアクセスできなくても、悪意のあるコードを挿入するだけで、システムに格納されている情報のほとんどではなくてもほとんどを取得できることに基づいて、セキュリティの側面を無視します。親愛なる主よ、顧客のクレジットカードの詳細を記録する行を削除するのを忘れたとは信じられません!)。 小さな更新(6/6/2012) ストアドプロシージャ(少なくともOracleの場合)では、テーブルの構造を変更するとプロシージャとトリガーが無効になるため、ダウンタイムがゼロの連続配信のようなことはできません。したがって、DBが更新されている間、アプリケーションもダウンします。Oracleは、このためのEdition-Based Redefinitionと呼ばれるソリューションを提供しますが、この機能について私が尋ねた少数のDBAは、実装が不十分であり、運用DBに配置しないと述べました。

11
Javaでヌルを処理する最良の方法は?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 4年前に閉鎖されました。 NullPointerExceptionが原因で失敗するコードがあります。オブジェクトが存在しないオブジェクトでメソッドが呼び出されています。 しかし、これにより、これを修正する最良の方法を考えるようになりました。nullポインタ例外のコードを将来的に保証するために、nullに対して常に防御的にコーディングするか、nullの原因を修正してダウンストリームで発生しないようにする必要がありますか。 あなたの考えは何ですか?
21 java  null 

11
使用している継続的インテグレーションフレームワークとその理由 [閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 6年前に閉鎖されました。 そこにはかなりの数の異なる継続的インテグレーション(CI)フレームワークがあり、どれが最も人気があるのだろうかと思っています。勤務している企業でどのフレームワークを使用しましたか? あるCIフレームワークが他のCIフレームワークよりも人気がある理由はありますか?おそらく、それが提供する機能、それに統合されるもの、またはその単なるマーケティングによるものでしょうか? rubyやpythonよりも、Javaと.netの世界では継続的インテグレーションがより多く使用されているようです。どうしてこれなの?

9
新しいプログラマーに例外処理を教える方法は?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 4年前に閉鎖されました。 例外処理をプログラマーに教える方法を教えてください。他のすべてのこと-データ構造、ASP.NET、WinForms、WPF、WCF-を簡単に教えられます。名前を付ければ、すべてが簡単に教えられます。 例外処理では、try-catch-finallyを教えることは、例外処理の構文的な性質にすぎません。 ただし、教えるべきことは-コードのどの部分をtryブロックに入れますか?catchブロックで何をしますか? 例で説明しましょう。 Windows Formsプロジェクト(小さなユーティリティ)で作業しており、3つの異なるプロジェクトで以下のように設計しました。 UILayer BusinessLayer DataLayer DataLayerで例外(XDocumentをロードすると例外がスローされると言います)が発生した場合(UILayerがBusinessLayerを呼び出し、BusinessLayerがDataLayerを呼び出します)、次のようにしますか? //In DataLayer try { XDocument xd_XmlDocument = XDocument.Load("systems.xml"); } catch(Exception ex) { throw ex; } BusinessLayerで再びスローされ、ログファイルに書き込むUILayerでキャッチされるのはどれですか? これはあなたが例外処理をどのように行っているのですか?

6
効率的なtry / catchブロックの使用法?
catchブロックは、ロジックの記述、つまりフロー制御などの処理に使用する必要がありますか?または、例外をスローするためだけに?コードの効率や保守性に影響しますか? catchブロックにロジックを記述した場合の副作用(ある場合)は何ですか? 編集: catchブロック内にロジックを記述したJava SDKクラスを見てきました。例(java.lang.Integerクラスから抜粋したスニペット): try { result = Integer.valueOf(nm.substring(index), radix); result = negative ? new Integer(-result.intValue()) : result; } catch (NumberFormatException e) { String constant = negative ? new String("-" + nm.substring(index)) : nm.substring(index); result = Integer.valueOf(constant, radix); } EDIT2: 私は、例外の中に例外的なケースのロジックを書くことの利点としてそれを数えるチュートリアルを行っていました: 例外を使用すると、コードのメインフローを記述し、例外的なケースに対処することができます。 catchブロックでロジックを作成する場合としない場合の具体的なガイドラインはありますか?

2
ハンドラー、マネージャー、コントローラーの違い
クラスに「Handler」、「Manager」、または「Controller」という名前を付けるのに違いはありますか?IE: 、PurchaseManager、。PurchaseHandlerPurchaseController これらの十分な意味は同じ意味を伝えますか、それとも明確な違いがありますか? 言語に依存しない答えがない場合は、Javaを言語と考えてください。
21 java  naming 

2
パッケージとモジュールがJava 9で別個の概念である理由
Java 9には、パッケージに加えてモジュールがあります。通常、言語にはどちらか一方があります。そして、ほとんどのプログラマーは 2つの用語を同義語として認識しています。モジュールはパッケージの上に構築され、それらをプリミティブとして扱います。複合パターンは、プリミティブと複合物を均一に処理することを提案します。そうしないと、悪いことが起こります。たとえば、プロジェクトValhallaを見てください。そこでは、プリミティブ(値)および参照型の共通スーパータイプを後付けしようとしています。 モジュールとパッケージは意味的に分離した概念を表していますか?それを意味することの両方を持つことが賢明である任意の言語(関心事の分離)。または、Javaは後方互換性への賛辞として両方を持たなければなりませんか? 既存の概念を補強するのではなく、なぜ新しい概念を導入するのですか? JSR 376:プロジェクトJigsaw内に実装された「Javaプラットフォームモジュールシステム」。 SOTMSによると モジュールは、コードとデータの名前付きの自己記述型コレクションです。そのコードは、Javaクラスとインターフェースなどのタイプを含むパッケージのセットとして編成されています。そのデータには、リソースおよびその他の種類の静的情報が含まれます。 JLSは、パッケージとは何かを定義することを慎重に避けます。ウィキペディアから: Javaパッケージは、JavaクラスをModulaのモジュールに似た名前空間に編成するための手法で、Javaでのモジュール式プログラミングを提供します。 ウィキペディアを引用するのは悪い習慣であることは知っていますが、それは一般的な理解を反映しています。モジュラープログラミングのエントリから: パッケージという用語は、モジュールの代わりに使用されることがあります(Dart、Go、またはJavaなど)。他の実装では、これは明確な概念です。Pythonではパッケージはモジュールのコレクションですが、今後のJava 9では新しいモジュールの概念(強化されたアクセス制御を備えたパッケージのコレクション)の導入が計画されています。


5
なぜ型がそのビルダーと結合されるのでしょうか?
私は最近、Code Reviewで私のJavaの回答を削除しました。 private Person(PersonBuilder builder) { やめる。赤旗。PersonBuilderはPersonを構築します。それは人について知っています。PersonクラスはPersonBuilderについて何も知らないはずです-それは単なる不変の型です。ここで、Aに依存するBに依存するAに依存する循環カップリングを作成しました。 Personはパラメータを取得するだけです。構築せずにPersonを作成するクライアントは、それを実行できる必要があります。 私は下票で平手打ちされ、それを(引用して)赤旗と言った、なぜ?ここでの実装は、Joshua Blochが彼の「Effective Java」本(アイテム#2)で示したものと同じ形をしています。 したがって、Javaでビルダーパターンを実装する正しい方法は、ビルダーをネスト型にし(これはこの質問の目的ではありません)、製品を作成することです(ビルドされているオブジェクトのクラス)このように、ビルダーに依存します: private StreetMap(Builder builder) { // Required parameters origin = builder.origin; destination = builder.destination; // Optional parameters waterColor = builder.waterColor; landColor = builder.landColor; highTrafficColor = builder.highTrafficColor; mediumTrafficColor = builder.mediumTrafficColor; lowTrafficColor = builder.lowTrafficColor; } https://en.wikipedia.org/wiki/Builder_pattern#Java_example 同じBuilderパターンの同じWikipediaページには、C#の実装が大きく異なります(そして、はるかに柔軟です)。 //Represents a product created …

3
Java / Linuxスタックが「リアルタイム」に失敗する理由は何ですか?
開発者は、Javaが「リアルタイムを実行できない」、つまりLinuxで実行されているJavaアプリがRIOT-OSで実行されているものなどの確定的なリアルタイムシステムの要件を満たせないことを言及することをよく耳にします。 理由を理解しようとしています。私のSWAGによると、これはおそらくJavaのガベージコレクターによるものと思われます。Javaガベージコレクターはいつでも実行でき、システムを完全に一時停止できます。また、いわゆる「一時停止GC」はありますが、必ずしも広告を信じているわけではありません。また、趣味のプロジェクトに分岐するためのJVMインスタンスあたり$ 80Kもありません。 Linuxでのドローンソフトウェアの実行に関するこの記事も読んでいました。その記事で、著者はLinuxがドローンを車に衝突させそうになったシナリオについて説明しています。 Piで低レベル制御ループ(PID)を実行することを選択した後、ハードレッスンを学びました-巧妙にしようとして、デバッグのためにループの中央にログ書き込みを配置することを決めました-クワッドは最初はうまく飛んでいましたが、Linuxは決定しました1つのログエントリを書き込むのに2秒かかり、クワッドは私の車にほとんどクラッシュしました! その著者はドローンソフトウェアをC ++で作成しましたが、Linux上で実行されているJavaアプリが同じ運命をたどる可能性が非常に高いと思います。 ウィキペディアによると: 操作の全体的な正確さが、その論理的な正確さだけでなく、実行される時間にも依存する場合、システムはリアルタイムであると言われます。 だから、私には、この手段は、「総正しさを論理的正当性と適時性を必要とする場合は、リアルタイムではありません。」 Javaアプリを書いて超高性能になり、いわば「レモンを絞る」ようになりましたが、それを(Javaで)速く書くことはできませんでした。 全体として、私の質問は次のとおりです。Linuxを実行しているJavaアプリが「リアルタイムアプリ」にならない理由のすべて/ほとんどの理由を説明してくれる人を探しています。つまり、Java / Linuxスタック上の「タイムリー」であることを妨げ、したがって「完全に正しい」ことを妨げるすべてのカテゴリは何ですか?前述のように、GCとLinuxのログフラッシュは実行を一時停止する可能性がありますが、Javaアプリ自体の外部には、タイミングやパフォーマンスが低下し、ハードデッドラインの制約を満たすものがもっとあるはずです。彼らは何ですか?
20 java  linux  real-time 

1
<の違いは何ですか?Foo>および<Foo>を拡張します
私は、違いについて誤解があるようだ&lt;Foo&gt;とし&lt;? extends Foo&gt;。私の理解から、もしあれば ArrayList&lt;Foo&gt; foos = new ArrayList&lt;&gt;(); これは、タイプのオブジェクトFooをこの配列リストに追加できることを示します。のサブクラスFooもtype Fooであるため、次のようにエラーなしで追加できます。 ArrayList&lt;Foo&gt; foos = new ArrayList&lt;&gt;(); foos.add(new Foo()); foos.add(new Bar()); ここでBar extends Foo。 さて、私が定義されていたと言うfoosと ArrayList&lt;? extends Foo&gt; foos = new ArrayList&lt;&gt;(); 私の現在の理解はこれが表現するということsome unknown type that extends Fooです。これは、サブクラスであるオブジェクトFooをこのリストに追加できることを意味します。差がないことを意味ArrayList&lt;Foo&gt;してArrayList&lt;? extends Foo&gt;。 これをテストするために、次のコードを記述しようとしました ArrayList&lt;? extends Foo&gt; subFoos = new ArrayList&lt;&gt;(); subFoos.add(new Foo()); subFoos.add(new Bar()); …
20 java  generics 

1
Mavenに似たHaskellビルドおよびアーティファクト環境
私は以前からJava開発者でしたが、最近、Haskellチームに参加しました。Javaの世界では、複数のチームが取り組んでいる大規模なプロジェクトがある場合、Mavenなどのアーティファクトサーバーを使用して開発を容易にし、スピードアップするのが一般的なアプローチです。Ant、Maven、Gradleなどの多数のビルドツールを使用してプロジェクトをビルドし、jarファイルをアーティファクトサーバーにアップロードして、チームの残りのメンバーが簡単に使用できます。したがって、プロジェクトをより小さなサブプロジェクトに分割することにより、ビルド時間も大幅に短縮されます。 Haskell側ではcabal、プロジェクトのビルドに使用しています。このプロジェクトは、最適化なしでビルドするのに約10〜15分かかります。コンパイラーの最適化がオンになっている場合、数時間かかりますが、これは苦痛です。 ここでJavaで行うのと同じことをどのように行うことができるのでしょうか。パッケージ(ライブラリ)のバイナリをコンパイルしてアーティファクトサーバーにアップロードし、ビルド時にビルド済みのバイナリを使用する簡単な方法はありますか?Haskellは(Javaのバイトコードではなく)マシンコードを生成するため、互換性の問題があるかもしれませんが、アーティファクトサーバーに格納されているアーキテクチャ/ OSごとに異なるバイナリを使用できる可能性があります。

7
ifステートメントまたはスイッチの長いチェーン以外に、これを行うためのよりインテリジェントな方法はありますか?
メッセージを受信するIRCボットを実装し、そのメッセージをチェックして、呼び出す関数を決定しています。これを行うより賢い方法はありますか?20個のコマンドが好きになった後、すぐに手に負えなくなるようです。 おそらくこれを抽象化するより良い方法がありますか? public void onMessage(String channel, String sender, String login, String hostname, String message){ if (message.equalsIgnoreCase(".np")){ // TODO: Use Last.fm API to find the now playing } else if (message.toLowerCase().startsWith(".register")) { cmd.registerLastNick(channel, sender, message); } else if (message.toLowerCase().startsWith("give us a countdown")) { cmd.countdown(channel, message); } else if (message.toLowerCase().startsWith("remember am routine")) …

4
Javaプログラムの高レベルの構造を文書化する方法は?
背景: 私の共同研究者と私は学術雑誌の記事を書いています。研究の過程で、Javaでシミュレーションプログラムを作成しました。シミュレーションプログラムを他の人が自由に利用できるようにしたいと考えています。GitHubリポジトリでコードをホストすることにしました。他の人が簡単に使用できるようにするために、次のような優れたドキュメントを作成します。 各クラスとメソッドのJavadoc コードの使用方法 コードの高レベルの構造を記述する 私の高レベルの質問は次のとおり です。プログラムの高レベルの構造を説明するために使用できる単語と図の良い例を提供できますか? これにはサブ質問として含まれます: どのパッケージにどのクラスが含まれているかをどのように示しますか? 他のパッケージに依存するパッケージをどのように表示しますか? プログラム内のオブジェクト/クラスがどのように連携するかをどのように示しますか? 私たちは、コードの設計にドメイン駆動設計原則を使用しようとしました。ドメイン内のオブジェクトと、これらのオブジェクトをエンコードする特定のソースコードファイルとの対応をどのように示しますか?(以下のプロジェクトの私の「ユビキタス言語」の説明を参照してください。) これまでにやったこと ユビキタス言語 コードの「ユビキタス言語」の説明をファイルのubiquitous-language.md次の内容に入れます。 このプロジェクトの目的は、異なるリードタイムモデル、レポート遅延、および需要モデルの下で、単一施設を備えた単純なサプライチェーンで補充ポリシーがどの程度うまく機能するかを調査することです。 各期間で、次のイベントが発生します。 出荷が現在の期間に施設に到着するようにスケジュールされている場合、施設の在庫レベルはX単位だけ増加します。 現在の期間がレポート期間であることがスケジュールに示されている場合、施設はレポートをサプライヤーに提出し ます。サプライヤーは、受信することができるレポート によって指定されるように、数週間の遅れまたは、瞬時スケジュール。 サプライヤがレポートを受信した場合、補充ポリシーに基づいて、 Xユニットの補充量を計算します。出荷製品のXユニットは、L期間のリードタイムの後に到着する予定であろう。 顧客は施設に到着し、製品のXユニットを要求します。満たされていない需要は失われます。 ソースコード構造 コードの不完全な「高レベル」説明をファイルstructure.mdに入れます。内容は以下のとおりです。 パッケージレベルの構造 最高レベルでは、ソースコードは3つのパッケージに編成されています。 com.gly.sfsmainメソッドを 持つメインクラスはこのパッケージにあります。 com.gly.sfs.model ドメインモデルクラスはこのパッケージにあります。 com.gly.sfs.util ヘルパークラスはこのパッケージにあります。

4
複数のインターフェイスを結合する空のインターフェイス
次の2つのインターフェイスがあるとします。 interface Readable { public void read(); } interface Writable { public void write(); } 場合によっては、実装オブジェクトはこれらの1つしかサポートできませんが、多くの場合、実装は両方のインターフェイスをサポートします。インターフェイスを使用する人々は次のようなことをしなければなりません: // can't write to it without explicit casting Readable myObject = new MyObject(); // can't read from it without explicit casting Writable myObject = new MyObject(); // tight coupling to actual implementation MyObject myObject …

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