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

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

1
依存バージョンの競合を回避しますか?
私のjarを使用するすべてのJavaプロジェクトは、ほぼ確実に、私のjarにも依存関係として含まれている別のjarへの追加の依存関係があります。 問題は、他のjarに複数のバージョンがあることです。 プロジェクトの2番目のjarのバージョンが私のjarの2番目のjarのバージョンと異なる可能性が高い場合に、発生する可能性のある問題を回避するにはどうすればよいですか? 私のjarファイルを追加するために、ユーザーが特別なクラスローディングトリックを実行するという面倒なことをしたくありません。 その共通の依存関係のすべての可能なバージョンについて、jarのさまざまなバージョンの束を作成する必要がありますか?そして、あなたはちょうどあなたがたまたま持っている2番目のjarの同じバージョンを使用する私のjarのバージョンを選択するだけですか? これを処理するよりスマートな方法はありますか、そして人々が衝突することなく私のjarをより簡単に使用できるようにしますか?

2
ゲッターとセッターを避け、ユーザー情報を表示する
バックグラウンド 私は「クリーンコードブック」を読んでいます。並行して、私は銀行口座などの体操のカタに取り組んでおり、そのルールに固執しています: 体操の9番目のルールは、ゲッターやセッターを使用しないことです。 とても楽しいようで、私はこの原則に同意します。さらに、作者はClean Codeの98〜99ページで、ゲッター/セッターが抽象化を壊し、オブジェクトに問い合わせる必要はないが、オブジェクトに通知する必要があると説明しています。 これは私の心の中で完全に理にかなっており、私はこの原則に完全に同意します。問題は実際に起こります。 環境 たとえば、一部のユーザーをリストし、ユーザーの詳細を表示する必要があるアプリケーションがあります。 私のユーザーは以下で構成されています: -> Name --> Firstname --> String --> Lastname --> String -> PostalAddress --> Street --> String --> PostalCode --> String 問題 どのように私は行うことができ、または私は私だけ(簡単な情報を表示する必要があるときゲッターを避けるために何ができると私はその特定のフィールドに余分な操作を必要としないことを確認する必要があり(単純でのFirstName値を表示します)ランダム)出力サポート? 頭に浮かぶのは 1つの解決策は、 user.getName().getFirstName().getStringValue() これは完全に恐ろしいことであり、体操の多くのルールを破り、デメテルの法則を破ります。 別のものは次のようなものです: String firstName = user.provideFirstnameForOutput(); // That would have called in the user object => …

7
循環的複雑度が単一のメソッドで重要なのはなぜですか?
最近からSonarLint for Eclipseを使用していますが、それは非常に役立ちました。しかし、それは私に循環的複雑さについての疑問を投げかけました。 SonarLintは許容できるCCを10と見なし、私がそれを超えている場合があります(約5または6ユニット)。これらの部分は、値がさまざまな変数に依存するマッパーに関連しています。次に例を示します。 フィールドAは文字列sAに依存しています。 フィールドBは文字列sBに依存しています。 フィールドCはString sCに依存しています。 など... if各フィールドに置くこと以外に選択肢はありません。これは(幸いにも)私の選択ではありませんが、自分で変更できない既存の複雑なシステムです。 私の質問の核心は、次のとおりです。単一の方法で CCが高すぎないことがなぜ重要なのですか。いくつかの条件を1つまたは複数のサブメソッドで移動して複雑さを軽減しても、全体的な機能のコストは削減されず、問題が別の場所に移動するだけだと思いますか? (もしあれば、小さな間違いのため申し訳ありません)。 編集 私の質問は、グローバルな循環的複雑度についてではなく、単一のメソッドの複雑度とメソッドの分割についてのみです(申し訳ありませんが、私が正確に何を意味するかを説明するのに大雑把な時間を費やしています)。すべてのサブメソッドを実行するだけの「スーパーメソッド」にまだ属しているのに、条件を小さなメソッドに分割して、アルゴリズムに複雑さを加えることが許されるのはなぜですか。 ただし、2番目のリンク(アンチパターンについて)は非常に役立ちます。

4
オブジェクト指向プログラミングのメインの責任は何ですか?
私はオブジェクト指向プログラミングに不慣れで、メインの目的が何なのかわかりません。 はい、私はそれがプログラムの「入り口」であると読みましたが、私が理解していないことは、メインに何があるべきかです。そして、その責任は何ですか? メインで記述された何かが別のオブジェクトにカプセル化される可能性がありますが、このアプローチをどの程度使用する必要がありますか? これが私がJavaで書いた最初のメインです。非常にシンプルですが、私の疑問をよりよく理解してくれるかもしれません。「Cat」と「Dog」によって拡張された抽象クラスAnimalがあります。メインを使用してオブジェクトを作成し、ユーザーとの「インターフェース」としても使用しました。実際に、条件付きの指示を使用して、ユーザーが何をしたいかを「ユーザーに尋ねる」ことができます。 私の質問は、インターフェイスが別のオブジェクトにカプセル化され、メインにその責任を与えないという事実から生じました。 public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("What type of animal do you want to create? \n dog cat"); String type = input.nextLine(); if ( Objects.equals(type, "dog")){ System.out.println("Enter the animal's age: "); int age = input.nextInt(); // Scans the next token …

5
小さなオブジェクトの作成を最小限に抑える必要がありますか?
多数の(1000を超える)小さなオブジェクトを頻繁に作成するものを作成する場合、パフォーマンスのためにそれを最小化する必要がありますか?特に、ローエンドからハイエンドのデスクトップ、さらにはモバイルまで、どのシステムで実行されるかわからない場合。モバイルの場合、多くのオブジェクトを作成するとパフォーマンスが少し低下すると聞きましたが、それがどれほど本当かはわかりません。 この考えをよく示す例があります。グラフィックプログラムでは、理想的にはと呼ばれるすべての描画に使用されるメソッドがあるとしましょうdrawPixel(Point)。1秒間に60回以上呼び出される可能性のあるゲームのように、作成されるポイントは1000になり、頻繁に繰り返される場合があります。または、drawPixel(int x, int y)多くのポイントオブジェクトの作成を最小限に抑えるために使用できます。 オブジェクト指向の設計では、Pointを使用することをお勧めします。ただし、プリミティブ型を使用するとパフォーマンスが向上する場合があります。ほとんどの場合、パフォーマンスの向上はごくわずかですが、モバイルマシンや古いマシンなどについてはよくわかりません。このようなことを行うことによるパフォーマンスの向上は何ですか?それは考慮に入れられるべきものですか?

5
LSPに違反しても大丈夫ですか?
私はこの質問についてフォローアップしていますが、コードから原則に焦点を移しています。 Liskov置換原理(LSP)についての私の理解から、私の基本クラスにあるメソッドは何でも、それらは私のサブクラスに実装する必要があります。このページによれば、基本クラスのメソッドをオーバーライドし、何も実行しないか、例外、あなたは原則に違反しています。 さて、私の問題は次のようにまとめることができます:私は抽象Weapon classと2つのクラス、Swordとを持っていReloadableます。と呼ばれるReloadable特定のが含まれている場合、それにアクセスするにはダウンキャストする必要があります。理想的には、それを回避する必要があります。methodReload()method 次に、を使用することを考えましたStrategy Pattern。このように、各武器は実行可能なアクションのみを認識していたため、たとえば、Reloadable武器は明らかにリロードSwordできますが、リロードすることはできませんReload class/method。Stack Overflowの投稿で述べたように、ダウンキャストする必要はなく、List<Weapon>コレクションを維持できます。 で別のフォーラム、最初の答えができるようにする提案Swordを認識するReloadだけで何もしません、。これと同じ答えが、上でリンクしたスタックオーバーフローのページにもありました。 理由はよくわかりません。なぜ原則に違反し、Swordにを認識さReloadせ、空白のままにするのですか?Stack Overflowの投稿で述べたように、SPで問題がほぼ解決しました。 なぜそれが実行可能な解決策ではないのですか? public final Weapon{ private final String name; private final int damage; private final List<AttackStrategy> validactions; private final List<Actions> standardActions; private Weapon(String name, int damage, List<AttackStrategy> standardActions, List<Actions> attacks) { this.name = name; this.damage = damage; standardActions = new …

1
単純な構成の代わりに弱参照を使用した方がよい状況はありますか?
が、Javaのドキュメントを指定し、その弱参照は、主にマッピングをcanonicalizingために、あなたが見つけるされている多くの、多くの、多くのWeakHashMapは、その存続期間中にオブジェクト・メタデータを格納するための完璧であることを、述べてインターネット上の人々を。ただし、誰もがわかりやすく適切な例を作成することに煩わされることはありません。 WeakHashMapを使用してオブジェクトにいくつかのプロパティを追加するか、メタデータサウンドを格納します。言い換えれば、悪いデザインです。継承が利用できない場合があることを理解しています(最終的なクラス、インターフェース)が、構成についてはどうですか?合成が選択肢にならない一例は考えられません。「言語の癖」ではなく、確立された原則に依存しているので、確かにより良いものです。 それでは、単純な構成の代わりに弱参照を使用した方がよい状況はありますか?そうでない場合、なぜインターネット上の誰もがそれを誤解しているように見えるのですか?


4
Javaでnullステートメントが使用されるのはいつですか?
私がクラスを探してきた教科書で、それは述べられています、ステートメントは空になることができます(nullステートメント)。nullステートメントは、単なるセミコロンとして定義されます。 実行時にはまったく何もしません。nullステートメントはほとんど使用されません。 適度に経験のあるプログラマーとして、めったに使用されないと言うのは興味深いことです。これは、どこかにその使用があることを意味しています。 そのような声明の使用はおそらく何でしょうか?
10 java 

2
Oracle Javaチュートリアルで、チェックされた例外とチェックされていない例外が「論争」と呼ばれるのはなぜですか?
私はJavaが初めてで、例外に関するドキュメントを読んでいました。、特にチェックされていない例外—論争のページ。 一番下の行は言う: クライアントが例外からの回復が合理的に期待できる場合は、チェック済み例外にします。クライアントが例外から回復するために何もできない場合は、チェックされていない例外にします。 記事がわかりません。「論争」とは何ですか?簡単な言葉で説明できますか?

5
コンパイル時の値パラメーターを使用したJavaクラスの生成
クラスが同じ基本的な動作、メソッドなどを実装しているが、そのクラスの複数の異なるバージョンが異なる用途に存在する可能性がある状況を考えてみましょう。私の特定のケースでは、ベクトル(リストではなく幾何学的ベクトル)があり、そのベクトルは任意のN次元ユークリッド空間(1次元、2次元など)に適用できます。このクラス/タイプはどのように定義できますか? これは、クラステンプレートがパラメーターとして実際の値を持つことができるC ++では簡単ですが、Javaにはそのような贅沢はありません。 この問題を解決するために私が考えることができる2つのアプローチは次のとおりです。 コンパイル時に可能な各ケースの実装を持つ。 public interface Vector { public double magnitude(); } public class Vector1 implements Vector { public final double x; public Vector1(double x) { this.x = x; } @Override public double magnitude() { return x; } public double getX() { return x; } } public class Vector2 …

2
Javaで入力を取得するためにスキャナークラスのインスタンスが必要なのはなぜですか?
Javaはオブジェクト指向ですが、入力を得るためにスキャナークラスからオブジェクトを作成する必要があるのはなぜですか?next()たとえば、メソッドを静的にすることはできませんか? Cは、あなたがscanf()、gets()またはを使用するだけなので、かなりシンプルに見えますfgets()。Java開発者がScannerクラスを作成する理由は確かにありますが、通常の関数を使用するだけで作業を行うよりもどのように優れているのでしょうか。 同じ質問をしているように見えるかもしれないこのリンクを見つけましたが、答えはちょうど約です 「静的ではないため、オブジェクトを作成する必要があります」... 私の推測では、Javaはオブジェクト指向であるため、すべてのインプットメソッドをクラスに入れることにしました。それらは静的メソッドを実行しなかったので、さまざまなオブジェクトにあらゆる種類のさまざまなソース(キーボード入力、ファイル入力...)を含めることができますか? 誰かが質問を編集して、より明確に聞こえるようにしていただければ幸いです!

3
クリーンなコードとハイブリッドオブジェクトおよび機能羨望
そのため、最近、コードにいくつかの主要なリファクタリングを行いました。私がしようとした主なことの1つは、クラスをデータオブジェクトとワーカーオブジェクトに分割することでした。これは、とりわけ、Clean Codeの次のセクションに触発されました。 ハイブリッド この混乱は、半分のオブジェクトと半分のデータ構造である不幸なハイブリッドデータ構造につながることがあります。それらには重要な機能を果たす関数があり、パブリック変数またはパブリックアクセサーとミューテーターのいずれかがあり、すべての目的と目的のためにプライベート変数をパブリックにして、他の外部関数がそれらの変数を手続き型プログラムが使用する方法で使用するように誘惑しますデータ構造。 そのようなハイブリッドは、新しい関数を追加することを難しくしますが、新しいデータ構造を追加することも難しくします。彼らは両方の世界で最悪です。それらを作成しないでください。それらは、作者が関数や型からの保護を必要としているかどうか、またはさらに悪いことに無知である混乱した設計を示しています。 最近、私はワーカーオブジェクトの1つ(たまたま、Visitorパターンを実装する)のコードを見て、これを確認しました。 @Override public void visit(MarketTrade trade) { this.data.handleTrade(trade); updateRun(trade); } private void updateRun(MarketTrade newTrade) { if(this.data.getLastAggressor() != newTrade.getAggressor()) { this.data.setRunLength(0); this.data.setLastAggressor(newTrade.getAggressor()); } this.data.setRunLength(this.data.getRunLength() + newTrade.getLots()); } 私はすぐに「!このロジックがであるべき機能の羨望自分自身に言ったData-特に、クラスhandleTradeメソッド。handleTradeとupdateRunする必要があり、常に一緒に起こります」。しかし、「データクラスは単なるpublicデータ構造です。それを始めれば、ハイブリッドオブジェクトになるでしょう!」 何が良いのか、そしてその理由は?どちらを行うかをどのように決定しますか?

2
JVMはmainメソッドによってスローされた例外をどのように処理しますか?
私は例外を理解し、それらをスローし、それらを処理し、それらをコールスタックの下位のメソッド(つまりthrows)に伝達します。 私が理解していないのはこれです: public static void main(String[] args) throws Exception { ... } 今、私はをmainスローする場合Exceptionに、JVMがそれを処理すると仮定します(正しい?)。その場合、私の質問は次のとおりです。 JVMはスローされた例外をどのように処理しmainますか?それは何をするためのものか?
10 java  exceptions  jvm 

3
継承:スーパークラスからのコードは実質的にサブクラスに「コピー」されますか、それともサブクラスによって参照されますか?
Class SubはclassのサブクラスですSup。それは実際にはどういう意味ですか?言い換えれば、「継承」の実際的な意味は何ですか? オプション1: Supのコードが仮想的にSubにコピーされます。( 'copy-paste'と同じですが、コピーされたコードがサブクラスで視覚的に表示されていません)。 例:methodA()はもともとSupにあったメソッドです。SubはSupを拡張するのでmethodA()、(事実上)Subにコピーペーストされます。これで、Subにはという名前のメソッドがありmethodA()ます。コードのすべての行でSupと同じですmethodA()が、完全にSubに属しており、Supに依存していないか、何らかの方法でSupに関連しています。 オプション2: Supからのコードは実際にはSub にコピーされません。それはまだスーパークラスだけにあります。ただし、そのコードはサブクラスを介してアクセスでき、サブクラスで使用できます。 例:methodA()は、Supのメソッドです。SubはSupを拡張するのでmethodA()、Subから次のようにアクセスできますsubInstance.methodA()。しかし、実際methodA()にはスーパークラスで呼び出されます。つまり、methodA()は、サブクラスによって呼び出された場合でも、スーパークラスのコンテキストで動作します。 質問:2つのオプションのどちらが実際に機能するのですか?どれもない場合は、これらが実際にどのように機能するかを説明してください。

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