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

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

6
クラスでJavaストリームをフィルタリングする場合、instanceofの代わりはありますか?
1つのクラスを拡張するすべての型がJavaコレクションにパックされるプロジェクトで、予期しない状況が発生しました。ただし、そのクラスの特定の拡張のみに追加のメソッドが含まれています。それを「also()」と呼びましょう。他の拡張機能にはないことをはっきりさせておきます。そのコレクション内のすべてのアイテムで1つのタスクを実行する直前に、それを実装するすべてのアイテムでalso()を呼び出す必要があります。 最も簡単な方法はこれです: stuff.stream().filter(item -> item instanceof SpecificItem) .forEach(item -> ((SpecificItem)item).also())); stuff.stream().forEach(item -> item.method()); それは正常に動作しますが、「instanceof」がそこにあるのは快適ではありません。これは通常、コードの悪臭のマーカーです。このクラスを取り除くためだけにこのクラスをリファクタリングする可能性は非常に高いです。しかし、劇的なことをする前に、コミュニティに問い合わせて、StreamsまたはCollectionsのどちらかについてより経験のある人がより簡単な解決策を持っているかどうかを確認したいと思いました。 例(確かに非排他的)として、クラスによってエントリをフィルタリングするコレクションのビューを取得することは可能ですか?

4
OOD:Java継承とキャストによる子メソッドへのアクセス
私はいくつかのクラス持っているParentとしChild1... Child9Javaで実装されています。Parent抽象クラスであり、子クラスのすべての共通変数(多くのParent場合、インターフェースではなく抽象クラスを作成した主な理由です)、いくつかの抽象メソッド、およびいくつかの実装されたメソッドを含みます。 一部の子クラスには、それらに固有のカスタムメソッドがあります。ダウンキャストを使用して子メソッドを呼び出すことがよくあります。 Parent p = new Child1(); ((Child1) p).child1SpecificMethod(); どういうわけか、これはOODの悪い習慣だと感じていますが、それが本当にデザインの改善方法であるかどうかはよくわかりません。 -編集- とにかく変更する必要があるのは、多くの(今のところ)共通変数を整理するためにParentクラスを使用し、それらを具象クラスのメンバー(またはコンテナーオブジェクト)にすることです。

2
なぜStringを(finalとして)宣言してから使用するのですか?
典型的なSpring MVCバリデータークラスでは、ErrorsオブジェクトにerrorCode値を挿入するときに、文字列(props.somefield.req)を使用した場合との違いは何ですか? errors.rejectValue("elementId", "props.somefield.req"); 宣言された静的な最後の文字列と対になる? private static final String SOMFIELD_REQ = "props.somefield.req"; ... errors.rejectValue("elementId", SOMFIELD_REQ); 少しでもパフォーマンスは向上しますか?スタックオーバーフローに関するいくつかの質問(Stringとfinal、Javaでfinal Stringを定義することは理にかなっていますか)を読みましたが、この質問の更新の質問に答えることはできませんでした。

4
ネストされたマップと結合キー
私が現在取り組んでいるプロジェクトでは、ユーザーの年齢(大人、子供など)に応じて3つの異なるタイプの価格がありました。したがって、DBには次のようなテーブルがありました。 PRICES type Amount A 20 B 15 C .. D .. 最初は4種類の価格しかなかったので、コードには次のようなものがありました。 Map<String, BigDecimal> prices = new HashMap<String, BigDecimal>(); キーは価格タイプでした。 最近、彼らはすべての価格タイプに3つのサブタイプを追加する新しいビジネスルールを追加したので、次のようになります。 PRICES type subtype Amount A 1 20 A 2 15 A 3 .. B 1 .. B 2 .. ... .. .. 次の2つのオプションのどちらが良いと思いますか、そしてその理由は? ネストされたマップ Map<String, Map<String, BigDecimal>> prices; …

3
Javaでは、*プロジェクト全体*の実装からAPIを分離するいくつかの良い方法は何ですか?
あるプログラムへのプラグイン(Eclipseに類似)であるソフトウェアモジュールがあり、他のプラグインが呼び出すことができるAPIが欲しいと想像してください。あなたが別のAPIモジュール、持っていると思いますので、あなたのプラグインは、自由に利用できないではなく、実装モジュールAPIクライアントのみAPIモジュールをコンパイルすることができ、 -自由に利用でき、他のプラグインが直接へのリンクはする必要が唯一のものですがビルドパス上。APIが互換性のある方法で進化するように制限されている場合、クライアントプラグインはAPIモジュールを独自のjarに含めることもできます(Error存在しないクラスがアクセスされることによるsの可能性を防ぐため)。 ライセンスは、APIと実装を別々のモジュールに配置する唯一の理由ではありません。実装モジュールが複雑で、独自の無数の依存関係がある可能性があります。Eclipseプラグインには通常、内部パッケージと非内部パッケージがあり、非内部パッケージはAPIモジュールに似ています(どちらも同じモジュールに含まれていますが、分離することができます)。 私はこれのいくつかの異なる選択肢を見てきました: APIは、実装とは別のパッケージ(またはパッケージのグループ)にあります。APIクラスは、実装クラスを直接呼び出します。API は、実装なしでソースからコンパイルすることはできません(まれなケースでは望ましいことです)。実装がインストールされていない場合、APIメソッドの呼び出しの正確な影響を予測することは簡単ではありません。そのため、クライアントは通常、これを回避します。 package com.pluginx.api; import com.pluginx.internal.FooFactory; public class PluginXAPI { public static Foo getFoo() { return FooFactory.getFoo(); } } APIは別のパッケージにあり、リフレクションを使用して実装クラスにアクセスします。APIは実装なしでコンパイルできます。リフレクションを使用すると、パフォーマンスが低下する可能性があります(ただし、問題がある場合はリフレクションオブジェクトをキャッシュできます。実装が利用できない場合の動作を簡単に制御できます。 package com.pluginx.api; public class PluginXAPI { public static Foo getFoo() { try { return (Foo)Class.forName("com.pluginx.internal.FooFactory").getMethod("getFoo").invoke(null); } catch(ReflectiveOperationException e) { return null; // or throw a RuntimeException, …
8 java  api 

4
DIフレームワークはどのような複雑さを追加しますか?
非常に最近の質問に対する現在最も支持されている回答は、 DIコンテナーは「エンタープライズソフトウェア」パターンであり、オブジェクトグラフが非常に大きく複雑な場合に使用されます。アプリケーションの95%はそれを必要としないと思います。 これは私が強く反対することです。多分私は間違った用語を持っているかもしれませんが、私にとってDIフレームワークは単に「オブジェクトを一緒に配線する何か」を意味します。何か不足していますか? 非常に小さなプロジェクト(10クラスなど)でも、それらを簡略化するためにGuiceを使用しています。確かに、400 kBのJARファイルですが、これは私が気にすることではありません。小規模なプロジェクトの場合、設定はほとんど必要なく、唯一の「オーバーヘッド」は注釈の追加です。@Inject それで、私は本当に不思議に思います、DIフレームワークはどんな追加された複雑さを引き起こしますか? 回答への対応を更新 82クラスのプロジェクトでは、 32 @Inject注釈 15 @Singletonと1の@ProvidedBy注釈 4プロバイダー(これらはすべて私の工場であるため、DIなしでも必要です) 1つの行を含むモジュール 0行XML !!! それで全部です。確かに、それは小さなプロジェクトですが、まさにこれが私のポイントでした。追加の作業は、行ではなく数語でした。 不変の「使いやすい」オブジェクトを取得するために、コンストラクター注入のみを使用しています。新しい依存関係が出現するたびに、最終フィールドを追加し、LombokのRequiredArgsConstructorが宣言を処理するようにし、Guiceがそれを適切に呼び出すようにします。

4
Javaの配列がequals()をオーバーライドしないのはなぜですか?
私はHashSet先日、これを仕様書に書いているので作業していました: [add()]このセットに要素e2が含まれていない場合、指定された要素eをこのセットに追加します(e == null?e2 == null:e.equals(e2))。 私が使っていたchar[]中でHashSet、私は、この契約に基づいて、以下のことを実現するまで、それはよりも良いではなかったですArrayList!オーバーライドされていないを使用しているため.equals()、私の配列は参照の等価性のみがチェックされますが、これは特に有用ではありません。私はそれArrays.equals()が存在することを知っていますが、などのコレクションを使用しているときは役に立ちませんHashSet。 だから私の質問は、Java配列が等号をオーバーライドしないのはなぜですか?

3
オブジェクトの同一性と可変性
私はJavaの値型の提案を読んでいて、この文に出くわしました。「オブジェクトIDは可変性をサポートするためだけに機能し、オブジェクトの状態は変更できますが、同じ組み込みオブジェクトのままです。」 (仮にではあるが)私が理解していることから、オブジェクトIDは、変数がメモリ内の他の場所にあるオブジェクト(JavaまたはC#のヒープでインスタンス化されたオブジェクトなど)へのポインタまたは参照として機能するという考えです。では、これはオブジェクトの可変性とどう関係しているのでしょうか?これは、たとえば、C ++でスタックにインスタンス化されたオブジェクトが不変であることを意味しますか?ここのリンクが表示されません。

5
JavaまたはC#の(post / pre)インクリメント演算子の理由
最近、整数に対してポスト/プリインクリメント演算子を頻繁に使用するコードの出力を予測することについて、疑問に遭遇しました。私はCプログラマーの経験があるので、まるで我が家のように感じましたが、JavaがC(またはC ++)から盲目的にコピーしたものであり、これはJavaの役に立たない機能であるとの声がありました。 そうは言っても、Java(またはC#)でその理由(特にpost / preフォームの違いを念頭に置いて)を見つけることはできません。これは、配列を操作してJavaで文字列として使用するようなものではないためです。 。また、私が最後にバイトコードを調べたのはずっと前なので、INC操作があるかどうかはわかりませんが、これがなぜなのかはわかりません for(int i = 0; i < n; i += 1) より効果が少ない可能性があります for(int i = 0; i < n; i++) これが本当に役立つ言語の特定の部分はありますか、またはこれはCプログラマーを街に連れてくるための単なる機能ですか?
8 java  c# 

1
SQLクエリをREST APIリクエストに変換する方法は?
データベースへのインターフェースを提供するREST APIの機械で読み取り可能な記述(WADL、Swagger、RAMLなど)があるとします。 私のユーザーは、基になるデータベースに関するクエリをSQLまたは同様のクエリ言語の形式で送信します。ただし、REST APIを介してのみ、データベースに直接アクセスすることはできません。 そのようなSQLクエリを特定のREST APIへの一連のリクエストに変換するシステムを(できれば記述から半自動で)構築するには、どのアプローチを選択しますか? そのような問題をどのように表現しますか?役立つアルゴリズム、理論的フレームワーク、またはツールはありますか? REST APIは以下をサポートします。 読み取り専用操作、つまりSELECTSQLクエリのみ XPartialプロジェクション(例/persons?fields=firstname,lastname) RSQL制約(別の例を/persons?query=firstname==John;department.code==42参照)。 テーブル間の一部の参照(外部キー)はREST APIでは属性として表されますが(Person.department上記の制約の例など)、一部の参照はサブリソース(例:)として表されます/persons/{userName}/projects。つまり、一部のクエリでは、RESTリクエストに関して回答される「計画」を考案する必要があります。 例:「チャックノリスのアクティブなプロジェクトの名前」のクエリは、次のように変換されます。 /persons?query=firstname==Chuck;lastname==Norris userName結果から得る /projects/{userName}?fields=name&query=state==ACTIVE

2
ユニットテスト、工場、そしてデメテルの法則
これが私のコードの仕組みです。サードパーティのショッピングAPIに保存されている、ショッピングカートの注文に似たものの現在の状態を表すオブジェクトがあります。私のコントローラーコードで、私は呼び出すことができるようにしたいです: myOrder.updateQuantity(2); 実際に、第三者にメッセージを送信するためには、第三者にも同様THISために固有のいくつかのことを、知っている必要がありorderID、かつloginID、アプリケーションの存続期間中に変化しないであろう。 私が作成したときにmyOrder、もともと、私は注射MessageFactory知っています、loginID。次に、updateQuantityが呼び出されると、Orderパスがを通過しorderIDます。制御コードは簡単に記述できます。別のスレッドがコールバックを処理し、Order変更が成功した場合は更新Orderし、変更が失敗した場合は変更が失敗したことを通知します。 問題はテストです。のでOrder、オブジェクトが依存するMessageFactory、それが必要MessageFactory実際返すようにMessageSを(それが呼び出すこと.setOrderID()例えば、上)、今私は非常に複雑に設定する必要がMessageFactoryモックを。さらに、「モックがモックを返すたびに妖精が死ぬ」ので、私は妖精を殺したくありません。 コントローラーのコードを単純に保ちながら、この問題を解決するにはどうすればよいですか?私はこの質問を読みました:https : //stackoverflow.com/questions/791940/law-of-demeter-on-factory-pattern-and-dependency-injectionしかし、それはテストの問題について話していなかったので助けにはなりませんでした。 私が考えたいくつかの解決策: どういうわけか、ファクトリメソッドが実際のオブジェクトを返す必要がないようにコードをリファクタリングします。おそらく、それは工場ではなく、MessageSender? のテスト専用実装を作成しMessageFactory、それを注入します。 コードはかなり複雑です。sscceでの私の試みは次のとおりです。 public class Order implements UpdateHandler { private final MessageFactory factory; private final MessageLayer layer; private OrderData data; // Package private constructor, this should only be called by the OrderBuilder object. Order(OrderBuilder builder, OrderData initial) { this.factory = builder.getFactory(); …

2
次のイテレーターがこのイテレーターより優れている点は何ですか?
私はJava / C#イテレータを直接操作することはあまりありませんが、「次の」方法でイテレータを設計する理由は何だろうといつも思っています。 開始するには、イテレータを移動する必要があります。データがあるかどうかを確認するには、次の要素があるかどうかを確認する必要があります。 私にとってより魅力的なコンセプトはthis-iteratorです。これは最初から「始まる」ので、この状態を確認できるとしましょうisValid。したがって、コレクション全体のループは次のようになります。 while (iter.isValid()) { println(iter.current()); iter.next(); } ここで次の要素があるかどうかを確認するために、そこに行き、状態が有効かどうかを確認します。 YMMVですが、とにかく-このイテレーターよりも次のイテレーター(Java / C#など)の利点はありますか? 注:これは、言語の設計に関する概念的な質問です。
8 c#  java  iterator 

2
UIアプリケーションの匿名クラスに関するベストプラクティス
ユーザーインターフェイスベースのJavaプログラムで作業する場合、動作を特定のアクション(ボタンのクリックなど)に関連付ける1つの方法は、匿名クラスを使用することです。以下の例では、GUIフレームワークはSWTですが、SwingまたはAndroid UIコンポーネントでも同じ問題があります。つまり、私のプログラムの構造化です。 MenuItem sampleMenuItem = new MenuItem(popupMenu, SWT.NONE); sampleMenuItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { doSomething(); // handle all table entries for (int i=0; i<10; i++) { doSomething2(); } doSomething3(); doSomething4(); } }); もちろん、上のサンプルのコードの量はすでにロジックを含む専用クラスの作成を保証していると主張する人もいます。これは、Sonarの「匿名クラスは行が多すぎてはならない」という規則によっても示唆されています。 興味深いことに、このルールは次のことも指定しています。 squid:S1188-Javaでのクロージャーのサポートを待つ間、匿名クラスは、専用クラスを作成せずに動作を注入する最も便利な方法です。ただし、これらの匿名内部クラスは、動作が数行で実行できる場合にのみ使用してください。より複雑なコードでは、名前付きクラスが必要です。 ただし、Javaにはまだクロージャーが到着していないため、私の質問は次のようなエレガントな解決策があるかどうかです。 あらゆる種類の欠点(再利用が制限されている、コード内の移動が遅い、など)がある匿名クラス内で一連のコードを書く 膨大な数の専用クラスを作成し、それ自体が非常に限られた機能しか持たない可能性があります(つまり、オーバーエンジニアリングなど)。 私の質問を拡張します。JavaベースのUIアプリケーションのこの側面に関するベストプラクティスは何ですか?確立されたパターンはありますか?

1
AndroidのバンドルAPIがリストではなくArrayListを受け入れる理由
私はAndroidを使い始めActivityたばかりで、状態をバンドルに保存するチュートリアルを行っているときに、より一般的なListインターフェースを受け入れる代わりに、Bundleputメソッドが期待していることに気付きましたArrayLists。 例: Bundle.putCharSequenceArrayList(key, value) Bundle.putIntegerArrayList(key, value) Bundle.putParcelableArrayList(key, value) Bundle.putStringArrayList(key, value) 私たちのほとんどは、オブジェクトがインターフェイスによって参照される必要があることを示唆している効果的なJavaの項目52に精通しているので、このAPI決定の背後にある理由は何だったのかと思います。 あるArrayListおそらくアンドロイドの優先リストの実装?

4
スレッドまたはThreadPool?固定または動的ThreadPool?
入力をポートでリッスンするJavaプログラムがあります。入力に基づいて、Webサービスを呼び出し、成功/失敗をクライアントプログラムに返します。 クライアント接続ごとにスレッドをフォークします。プログラムに接続するクライアントへの応答は迅速でなければなりません。 これらは私が検討している選択肢です 通常のスレッドを使用する と使用ExecutorServiceするnewFixedThreadPool と使用ExecutorServiceするnewCachedThreadPool 私がプールを検討している理由は、私のスレッドが短命であるためです-スレッドはWebサービスを呼び出し、クライアントに結果を返し、接続を閉じます。 newFixedThreadPool接続がキューでスレッドを取得するために待機しているため、私は正しいことだとは思いません。 newCachedThreadPoolスレッドが1分後に死ぬということを除いて、完璧でした。私の場合、接続のバーストが発生します。つまり、複数の接続があり、その後数分間停滞する可能性があり、その後再びバーストします。CachedThreadPool内のスレッドは停止し、再度作成する必要があると思います。この場合、場合によっては#1のように動作する可能性があります。 理想的には、私はnewCachedThreadPool最小限にしたいと思っていました-つまり、スレッド数が決して20を下回らないという設定です。したがって、アイドル状態のスレッドは強制終了されますが、最小しきい値を下回ることは決してありません。 このようなものはありますか?または、より良い代替案はありますか?

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