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

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

1
Javaのデフォルトメソッドの使用
何十年には、インターフェースがあった場合をされているのみ だけメソッドのシグネチャを特定する(のみ)。これが「物事を行う正しい方法™」だと言われました。 その後、Java 8が登場して次のように述べました。 えーと、ええと、今ではデフォルトのメソッドを定義できます。さようなら。 経験豊富なJava開発者と、最近(ここ数年)開発を始めたJava開発者の両方によって、これがどのように消化されているのか興味があります。また、これがJavaの正統性と実践にどのように適合するかについても疑問に思っています。 私はいくつかの実験的なコードを構築しており、リファクタリングを行っている間に、標準インターフェース(Iterable)を単純に拡張し、2つのデフォルトメソッドを追加するインターフェースになりました。そして正直に言うと、私はそれについてかなり気分が良いと感じています。 私はこれが少しオープンエンドであることを知っていますが、実際のプロジェクトでJava 8を使用する時間がありましたが、デフォルトメソッドの使用に関する正統性はまだありますか?それらが議論されるときに私が主に見るものは、既存の消費者を壊すことなく、インターフェースに新しいメソッドを追加する方法についてです。しかし、上記の例のように最初からこれを使用するのはどうですか。インターフェースに実装を提供することで問題に直面した人はいますか?

6
オブジェクトをプレゼンターにマッピングするクリーンなOOP方法
私は、それぞれの作品は、独自のタイプ(のようであるジャワ、中(例えばチェスなど)ボードゲームを作成していますPawn、Rookなど)。アプリケーションのGUI部分では、これらの各部分の画像が必要です。やることは rook.image(); UIとビジネスロジックの分離に違反しているため、作品ごとに異なるプレゼンターを作成し、作品タイプを対応するプレゼンターにマッピングします。 private HashMap<Class<Piece>, PiecePresenter> presenters = ... public Image getImage(Piece piece) { return presenters.get(piece.getClass()).image(); } ここまでは順調ですね。ただし、getClass()メソッドを呼び出すと慎重なOOPの第一人者が眉をひそめ、次のようなビジターを使用することをお勧めします。 class Rook extends Piece { @Override public <T> T accept(PieceVisitor<T> visitor) { return visitor.visitRook(this); } } class ImageVisitor implements PieceVisitor<Image> { @Override public Image visitRook(Rook rook) { return rookImage; } } 私はこのソリューションを気に入っています(ありがとう、第一人者)が、1つの重大な欠点があります。新しいピースタイプがアプリケーションに追加されるたびに、PieceVisitorを新しいメソッドで更新する必要があります。私のシステムをボードゲームフレームワークとして使用して、フレームワークのユーザーがピースとそのプレゼンターの両方の実装のみを提供し、それをフレームワークにプラグインするだけの簡単なプロセスで新しいピースを追加できるようにします。私の質問:このような拡張性を可能にするinstanceof、getClass()などのないクリーンなOOPソリューションはありますか?

5
「静的インターフェイス」は良い習慣ですか?
最近、インターフェイスに静的メソッドを持つオプションがあることに気付きました。インターフェイスの静的フィールドと同様に、興味深い動作があります。これらは継承されません。 実装される実際のインターフェースで有用かどうかはわかりません。ただし、プログラマは、ユーティリティクラスなどの静的なものの単なるエンベロープであるインターフェイスを作成できます。 簡単な例は、グローバル定数の単なるエンベロープです。クラスと比較して、public static final想定されているボイラープレートの欠落に簡単に気付くことができます(冗長性が低くなります)。 public interface Constants { String LOG_MESSAGE_FAILURE = "I took an arrow to the knee."; int DEFAULT_TIMEOUT_MS = 30; } また、設定キーのこの疑似列挙のように、より複雑なものを作成することもできます。 public interface ConfigKeys { static createValues(ConfigKey<?>... values) { return Collections.unmodifiableSet(new HashSet(Arrays.asList(values))); } static ConfigKey<T> key(Class<T> clazz) { return new ConfigKey<>(clazz); } class ConfigKey<T> { private …
13 java  java8 

4
IDEが非常に賢い場合、「clone()」をキャストする必要があるのはなぜですか?
コードを入力している間、IDE(NetBeans)タイプがチェックしCollectionsます。しかし、その後、返されたオブジェクトをキャストする必要があるのはなぜObject.clone()ですか?大丈夫です。害もファウルもありません。しかし、それでも理解できません。 型チェックは、キャストせずに、返されたオブジェクトをObject.clone()不可能ですか?ジェネリックフレームワークは、私はIDEがチェックできると思いますタイプ「の右側のオブジェクト参照の=私はタイピングをしていながら、キャストなし」マークを?わかりません。 補遺 私の使用例は、私がプライベートCalendarフィールドpubdateを持っていたことだけでした。私は書くつもりでした: Calendar getPubdate() { return pubdate; } しかし、呼び出し側がpubdateを変更する可能性があるため、コピーを返しました。 Calendar getPubdate() { return (Calendar) pubdate.clone(); } 次に、なぜキャストする必要があるのか​​疑問に思いましたpubdate.clone()。メソッドシグニチャにはタイプがあります。NetBeansはそれを理解できるはずです。そしてNetBeansはに関して同様のことをしているようCollectionsでした。

5
壊れた古い/レガシーユニットテスト
私は大企業で働いており、何千ものJUnitテストがある大規模なJavaアプリケーションを担当しています。私がこの役割に移行して以来、200〜300のテストが壊れています(何年も壊れている可能性があります)。テストは古くて壊れやすく、通常はライブサンドボックスデータで終わるスパゲッティの依存関係の混乱です。 私の目標はテストを100%合格することで、単体テストの失敗でビルドを中断できますが、失敗したテストに対処するまではできません。メンテナンス予算は主にサポートのためであるため、予算はほとんどありませんが、私のチームは、問題の少ないフルーツテスト(主に構成/ローカルリソースの問題)を特定して修正しました。 ベストプラクティスに関する意見はありますか?テストは価値があるとは思いませんが、テストしているものが何なのか、掘り下げなければ動作しない理由もわかりません。おそらく時間とお金がかかるでしょう。 壊れたテストのステータスを既知のもので文書化し、壊れたテストを完全に削除または無視し、優先順位の低いバグ/作業項目を入力して調査および修正する必要があると考えています。その後、100%になり、他のテストから真の価値を引き出し始めます。メンテナンス/リファクタリングの失敗があれば、それらを再び拾い上げることができます。 最善のアプローチは何でしょうか? 編集:これはこの質問とは異なる質問だと思います。なぜなら、今後書くべきテストの明確な方向性があるからです。しかし、現在の大規模なテストセットが意味を持つようになる前に対処するために、レガシーの失敗したテストを継承しました。

4
1文字の変数の使用が推奨されていますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 Javaでは1文字の変数の使用が推奨されていますか?コードスニペットまたはチュートリアルでは、よく見かけます。コードを読むのが比較的難しくなり、他のプログラミング言語で使用されているのを見たことがないので、それらの使用が推奨されるとは想像できません!

3
どうすれば引数の数を低く保ちながら、サードパーティの依存関係を分離したままにできますか?
サードパーティのライブラリを使用しています。彼らは私たちの意図と目的のために、おそらく次のように実装されたPOJOを渡します: public class OurData { private String foo; private String bar; private String baz; private String quux; // A lot more than this // IMPORTANT: NOTE THAT THIS IS A PACKAGE PRIVATE CONSTRUCTOR OurData(/* I don't know what they do */) { // some stuff } public String getFoo() { …

5
C ++よりも高速なJavaヒープ割り当て
私はすでにこの質問をSOに投稿しましたが、大丈夫でした。それは残念ながら閉じられました(再開するには1票しか必要ありません)が、誰かが私がここに投稿することを提案したので、それはより適切なので、以下は文字通り質問のコピーペーストです この答えに関するコメントを読んでいたこの引用を見ました。 オブジェクトのインスタンス化とオブジェクト指向の機能は、最初から設計されているため、非常に高速です(多くの場合、C ++よりも高速です)。コレクションは高速です。ほとんどの最適化されたCコードであっても、標準Javaはこの領域で標準C / C ++に勝ります。 あるユーザー(私が追加する可能性のある非常に高い担当者)は、この主張を大胆に擁護し、 Javaでのヒープ割り当てはC ++よりも優れています Javaでコレクションを守るこのステートメントを追加しました また、主にメモリサブシステムが異なるため、JavaコレクションはC ++コレクションに比べて高速です。 だから私の質問はこれのどれでも本当に真実でありえ、もしそうなら、なぜJavaのヒープ割り当てがそんなに速くなるのかということです。

3
JavaベースのWebアプリケーションとスタンドアロンJavaアプリケーションのマルチスレッド化の違い
私はかなりJavaに慣れておらず、私の経験はWebコンテナ(私の場合はJboss)で実行されているWebベースのアプリケーションに限られています。 Webアプリケーションの場合、Webコンテナがマルチスレッドを処理すると言ってもいいですか?その場合、Webベースのアプリケーションに新しいトレッドを導入できますか?そうすることには利点があり、どのシナリオでそれを行う必要がありますか?

2
私の小さなソフトウェアライブラリは他のライブラリの使用を避けるべきですか?
わずかなクラスとメソッドのみを提供する小さなJavaライブラリをリリースしました。Mavenを使用してプロジェクトを構築したので、すぐにいくつかのサードパーティライブラリを使用して、特に次の目標を達成しました。 commons-lang3(いくつかの一般的なJavaのもの用) slf4j-api(ロギング用) commons-io(ほんの少しのファイル用-文字通り一度ファイルを読む、と思う) 自分のライブラリが他人の目に肥大化しているように見せたくない。フットプリントを最小限に抑えるために、これらのライブラリへの依存を削除する必要がありますか?将来さらに多くのライブラリを使用することを検討する際に、どのタイプのライブラリを避けるのが最善かについてアドバイスはありますか
13 java  libraries  maven 

2
クラスを介してすべてのコードを構造化し、クラス(Javaなど)にコンパイルすることの長所と短所
編集:私の言語は、Javaとは異なり、複数の継承を可能にします。 教育、レクリエーション、潜在的に有用な目的のために、独自のプログラミング言語の設計と開発を開始しました。 最初は、Javaをベースにすることにしました。 これは、すべてのコードがクラスの形式で記述され、そのコードがVMによってロードされるクラスにコンパイルされることを暗示しています。 ただし、インターフェイスや抽象クラスなどの機能は必要ないため、除外しました。彼らはパラダイムを実施しているようで、私の言語はそれをしないようにしたいです。クラスをコンパイル単位として保持したかったのは、実装が便利で馴染みがあり、アイデアが気に入ったからです。 それから、クラスをstaticディレクティブを使用して定数と関数を提供する「名前空間」として、またはインスタンス化する必要のあるオブジェクトのテンプレート(「実際の」クラスの目的)として使用できるモジュールシステムが基本的に残っていることに気付きました他の言語で)。 今、私は疑問に思っています:コンパイル単位としてクラスを持つことの利点と欠点は何ですか? また、私のデザインに関する一般的なコメントは大歓迎です。私の言語に関する有益な投稿は、http://www.yannbane.com/2012/12/kava.htmlにあります。

4
ソフトウェアパイプラインで共有データをカプセル化するための優れた実装戦略
既存のWebサービスの特定の側面のリファクタリングに取り組んでいます。サービスAPIの実装方法は、一連のタスクが順番に実行される「処理パイプライン」のようなものを持つことです。当然のことながら、後のタスクは前のタスクによって計算された情報を必要とする場合があり、現在これを行う方法は「パイプライン状態」クラスにフィールドを追加することです。 私は、無数のフィールドを持つデータオブジェクトを持つよりもパイプラインステップ間で情報を共有するより良い方法があると考えています(そして望んでいますか?)このクラスをスレッドセーフにするのは大きな苦痛になります(可能かどうかはわかりません)、その不変式について推論する方法はありません(そしておそらくないかもしれません)。 私はインスピレーションを見つけるためにGang of Fourのデザインパターンブックをページングしていましたが、そこに解決策があるとは感じませんでした(Mementoはやや同じ精神ですが、まったく同じではありませんでした)。私もオンラインで調べましたが、「パイプライン」または「ワークフロー」を検索する2番目のケースでは、Unixパイプ情報、または独自のワークフローエンジンとフレームワークのいずれかであふれています。 私の質問は、ソフトウェア処理パイプラインの実行状態を記録する問題にどのようにアプローチし、後のタスクが以前のタスクによって計算された情報を使用できるようにするかです。Unixパイプとの主な違いは、直前のタスクの出力だけを気にしないことです。 要求されたとおり、私のユースケースを説明するためのいくつかの擬似コード: 「パイプラインコンテキスト」オブジェクトには、さまざまなパイプラインステップで入力/読み取りできるフィールドがあります。 public class PipelineCtx { ... // fields public Foo getFoo() { return this.foo; } public void setFoo(Foo aFoo) { this.foo = aFoo; } public Bar getBar() { return this.bar; } public void setBar(Bar aBar) { this.bar = aBar; } ... // more …

2
インラインコードコメントの最適なアプローチは何ですか?
20年前のレガシーコードベースにリファクタリングを行っており、同僚とコードのコメント形式(plsql、java)について議論しています。 コメントにはデフォルトの形式はありませんが、ほとんどの場合、人々はコメントで次のようなことをします。 // date (year, year-month, yyyy-mm-dd, dd/mm/yyyy), (author id, author name, author nickname) and comment 私が望む将来および過去のコメントの提案された形式は次のとおりです。 // {yyyy-mm-dd}, unique_author_company_id, comment 私の同僚は、コメントだけが必要であり、過去および将来のすべてのコメントをこの形式に再フォーマットする必要があると言います。 // comment 私の議論: メンテナンス上の理由から、いつ、誰が変更を行ったかを知ることが重要です(この情報はSCMにあります)。 コードは生きており、そのために歴史があります。 変更日付がないと、SCMツールを開いて長いオブジェクト履歴を検索しないと、変更がいつ導入されたかを知ることができないためです。 著者は非常に重要であるため、著者の変更は著者の変更よりも信頼できる 敏ility性の理由、SCMツールを開いてナビゲートする必要はありません 人々は、最近作成または変更されたものよりも、誰かが15年前にしたことを変更することを恐れます。 等 私の同僚の議論: 歴史はSCMにあります 開発者は、コード内のコードの履歴を直接認識してはなりません。 パッケージの長さは15,000行になり、構造化されていないコメントはこれらのパッケージを理解しにくくします 最善のアプローチは何だと思いますか?または、この問題を解決するためのより良いアプローチがありますか?

4
Springを使用してBeanをインスタンス化しない場合
私はSpringの正しい使い方を理解しようとしています。構文的にではなく、その目的の観点から。Springを使用している場合、SpringコードはすべてのBeanインスタンス化コードを置き換える必要がありますか?Beanをインスタンス化するために、Springを使用する場合と使用しない場合 次のコードサンプルが私のジレンマを理解するのに役立つかもしれません: List<ClassA> caList = new ArrayList<ClassA>(); for (String name : nameList) { ClassA ca = new ClassA(); ca.setName(name); caList.add(ca); } Springを構成すると、次のようになります。 List<ClassA> caList = new ArrayList<ClassA>(); for (String name : nameList) { ClassA ca = (ClassA)SomeContext.getBean(BeanLookupConstants.CLASS_A); ca.setName(name); caList.add(ca); } 私は個人的にここでSpringを使用することは不必要なオーバーヘッドだと思います、なぜなら コードは読みやすく、理解しやすいです。 の複数の実装やさまざまな実装があることを期待していないため、Dependency Injectionにはあまり適していません。SpringのClassA設定を後から自由に置き換えたいと思います。 私は正しいと思っていますか?そうでない場合、どこで間違っていますか?
13 java  spring 

3
Javaのループの内側または外側で変数を宣言すると、違いが生じますか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 2年前に閉店。 可能な重複: どこで変数を宣言しますか?メソッドのトップまたはそれが必要なとき? Javaのループの内側または外側で変数を宣言すると、違いが生じますか? これは for(int i = 0; i < 1000; i++) { int temp = doSomething(); someMethod(temp); } これに等しい(メモリ使用量に関して)? int temp = 0; for(int i = 0; i < 1000; i++) { temp = doSomething(); someMethod(temp); } また、一時変数がArrayListなどの場合はどうなりますか? for(int i = …
13 java  variables  loops 

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