[解決済み] instanceof Vs getClass( )
質問
を使用すると、パフォーマンスが向上することが確認されています。
getClass()
と
==
演算子
instanceOf
演算子を使用します。
Object str = new Integer("2000");
long starttime = System.nanoTime();
if(str instanceof String) {
System.out.println("its string");
} else {
if (str instanceof Integer) {
System.out.println("its integer");
}
}
System.out.println((System.nanoTime()-starttime));
starttime = System.nanoTime();
if(str.getClass() == String.class) {
System.out.println("its string in equals");
} else {
if(str.getClass() == Integer.class) {
System.out.println("its integer");
}
}
System.out.println((System.nanoTime()-starttime));
どれを使えばいいのか、ガイドラインはありますか?
getClass()
または
instanceOf
?
あるシナリオが与えられたとき、私はマッチングされるべき正確なクラスを知っています。
String
,
Integer
(これらは最終クラスです)など。
を使用していますか?
instanceOf
演算子を使うのは悪いことですか?
解決方法は?
のパフォーマンスが低下する原因は
instanceof
と
getClass() == ...
が違うのは、やっていることが違うということです。
-
instanceof
左側 (LHS) のオブジェクト参照が右側 (RHS) の型のインスタンスであるかどうかをテストします。 または何らかのサブタイプ . -
getClass() == ...
は、型が同じかどうかをテストします。
ですから、パフォーマンスの問題は無視して、必要な答えを与えてくれる代替手段を使うことをお勧めします。
を使用することは可能ですか?
instanceOf
演算子を使うのは悪い習慣ですか?
必ずしもそうとは限りません。 どちらかを多用することで
instanceOf
または
getClass()
かもしれない
デザイン臭がする。 気をつけないと、新しいサブクラスを追加したときに、かなりの量のコードの手直しが発生するようなデザインになってしまいます。 ほとんどの場合、ポリモーフィズムを使用するのが望ましい方法です。
しかし、これが "design smell" "ではないケースもあります。 例えば
equals(Object)
は、引数の実際の型をテストする必要があります。
false
にマッチしない場合は これを行うには
getClass()
.
ベストプラクティス、バッドプラクティス、デザイン臭、アンチパターンなどという言葉は、あまり使わず、疑ってかかるべきでしょう。 これらは白か黒かの思考を助長します。 誰かが言ったベストプラクティスであるなど、純粋にドグマに基づいて判断するのではなく、文脈から判断する方がよいのです。 私は、すべての人に以下を読むことをお勧めします。 ベストプラクティスなし まだの方は、ぜひご覧ください。
関連
-
[解決済み] if / for / while 内で "Missing return statement" が発生する。
-
[解決済み] instanceofを呼び出す前にnullチェックは必要ですか?
-
[解決済み] instanceofとClass.isAssignableFrom(...)の違いは何ですか?
-
[解決済み] typeofとinstanceofの違いは何ですか、また、どのような場合にどちらを使うべきですか?
-
[解決済み] JavaScriptのinstanceof演算子とは何ですか?
-
[解決済み] Javaでinstanceofを使用することによるパフォーマンスへの影響
-
[解決済み】switch文の中でinstanceof演算子を使用することは可能ですか?
-
[解決済み】なぜinstanceofはいくつかのリテラルに対してfalseを返すのですか?
-
[解決済み】Javascript !instanceof Ifステートメント
-
[解決済み] .equals()を生成する際にinstanceofよりもgetClass()を優先する理由はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】imageio.IIOException: 入力ファイルが読み込めない
-
[解決済み】Javaの".class期待値"
-
[解決済み】不正なエスケープ文字"㊧"について
-
[解決済み】"比較メソッドはその一般契約に違反する!"
-
[解決済み】 JAVA 変数宣言はここではできない
-
[解決済み】Hibernateの例外「failed to lazily initialize a collection of role」の解決方法
-
[解決済み】ソースルート外のJavaファイル intelliJ
-
[解決済み] エラー - trustAnchors パラメータは空であってはなりません。
-
[解決済み】Eclipseで「パッケージエクスプローラー」ビューが見つからない
-
[解決済み] .equals()を生成する際にinstanceofよりもgetClass()を優先する理由はありますか?