2012-03-21 11 views
2

は:ステートレスクラスには何バイトありますか?私はこのクラスがある場合

public interface IBinaryCalculator{ 
double addition(double numb1, double numb2); 
} 

public class BinaryCalculator implements IBinaryCalculator{ 
double addition(double numb1, double numb2){ 
    return numb1+numb2; 

} 
} 

[OK]を、この方法は静的である必要がありますが、ちょっと私はこっちのインタフェースを持っています。 ISシングルトンは唯一の答えで、BinaryCalcのクラスにはありますか?私は10、000 BinaryCalculatorを構築する、それは単にメソッドを持っている、それはパフォーマンスに影響を与えている、または私はシングルトンを使用する必要があります言うことができます。

+0

クラスのメモリフットプリントはJVMに依存します。 –

答えて

1

は、私は完全に確認することはできませんが、あなたが指定されたオブジェクトの多くのインスタンスの作成に関連するパフォーマンスの問題についてはあまり心配していることが表示されます。

IMHO最初にデザインについて心配する必要があります。後でそのようなことが問題になる場合は、後でパフォーマンスについて心配する必要があります。正直なところ、あなたのクラスは、ヒープで何百万ものオブジェクトを泳ぐようなクラスのようには見えません。

インターフェイスはSAMタイプ(単一の抽象メソッド)と呼ばれます。 JDK自体にはたくさんの例があります。たとえば、java.util.Comparatorとjava.lang.Comparableが良い例です。

メソッドを静的に定義する場合は、デザインに基づいている必要がありますが、その機能の機能やシンプルさではありません。あなたは他の誰よりもあなたのデザインをよく知っているかもしれません。このフォーラムの開発者はあなたの良いアイデアやあなたの現在のアイディアに挑戦して、あなたがすでに持っているものを改善するのに役立つでしょう。

あなたが言及しているsinglentonパターンは、指定されたクラスのインスタンスをあらかじめ定義した数以上作成しないように意図しています。最も一般的には、それらを1つのインスタンスに制限します。なぜあなたのデザインでそのようなことをしたいのかは明らかではありませんが、インスタンスの数に関係するパフォーマンスについての心配はここでの最善の理由のようには聞こえません。あなたはおそらくあなたができるstatic factory methodクラスを持つ、電卓の種類を持っていることを計画している場合

あなたの設計を簡素化する方法を探して、あなたは、代わりにあなたのインターフェースのクラスの実装を提供する、インライン匿名内部クラスを使用するようなことがありすべてのSAMタイプの実装を置く:

public class Calculators { 

    public static BinaryCalculator getBasicCalculator(){ 
     return new BinaryCalculator() { 

      @Override 
      public double addition(double numb1, double numb2) { 
       return numb1 + numb2; 
      } 
     }; 
    } 

    public static BinaryCalculator getSofisticatedCalculator(){ 
     return new BinaryCalculator() { 

      @Override 
      public double addition(double numb1, double numb2) { 
       //do any other sofisticated calculation 
       return numb1 + numb2; 
      } 
     }; 
    } 

} 

次に、あなたは、単に行うことができます:あなたが実験を許可されている場合

public static void main(String[] args) { 
    BinaryCalculator simple = Calculators.getBasicCalculator(); 
    BinaryCalculator complex = Calculators.getSofisticatedCalculator(); 

    double result; 
    result = simple.addition(10,11); 
    result = complex.addition(10,11); 
} 

をまた、あなたはにそれを試してみるようなことがありここでは、電卓の実装をlamdbaの式で書くことができます。例えば

BinaryCalculator simple = (num1, num2) -> num1 + num2; 

、さらには、インライン方式では、

public class Pair { 
     private final double a; 
     private final double b; 

     public Pair(double a, double b){ 
      this.a = a; 
      this.b = b; 
     } 

     public double calculateWith(BinaryCalculator calculator){ 
      return calculator.addition(a,b); 
     } 
    } 

は、その後、あなたはこのようなあなたのSAMタイプのためのラムダの実装を提供し、簡単なこともできます、これは当然のことながら

Pair p = new Pair(10,11); 
double result = p.calculateWith((num1, num2) -> num1 + num2); 
System.out.println(result); 

ですJDK 8のプレビューだけですが、最新の機能を試すことができれば、それは本当にクールな解決策です:-)

+0

どのコーナーにもJAva Expert LOLがあります。 TNX man –

+0

この質問の目的は、Generic Repositoryの使用です。私はドメイン内のリポジトリを使用しますが、私はそのようにしたくありません。公開保存(){ リポジトリ rper = new JPARepository (); rper.save(this); } –

0

いくつかの質問、いくつかの回答。

  1. 私は状態のないオブジェクトが占有しているどのくらいのメモリわからないんだけど、それはそれに関連するモニターを持っているとして、それは、いくつかを必要とします。
  2. このタイプのクラスでは、java.lang.Mathのような静的アプローチを使用することも、通常のインスタンスベースのアプローチを使用することもできます。
  3. シングルトンはますます悪いスタイルとみなされており、注意して使用する必要があります。ステートレスなクラスの場合は大丈夫かもしれませんが、個人的には、無駄なオブジェクトを作成しないようにユーザーに依存するほうが好きです。
+0

「シングルトンがますます悪いスタイルと見なされている」という大胆な確認を参考にしてサポートをお願いします。シングルトンは、他の多くのパターンと同じように、有用であり、長所と短所があるコンテキストであり、強調することなく悪いアイデアであると主張する資料を読むことは非常に興味があります。与えられた文脈の特定の欠点 –

+0

このような大胆な主張のための単一の参照は確かにありません。これは、たぶん逸話から来るものであるからです。 hhttps://code.google.com/p/testability-explorer/ここであなたに指摘したいと思います。彼らは、シングルトンパターンを含む静的変数の使用を含むいくつかの問題について議論した適切なウェブサイトを持っていました。残念ながら、リンクはもう動作しません(または今夜など)。他の部分はリンクするのが難しいですが、シングルトンパターンと静的なものを使用して議論するときに得られるコメントに注意してください。 – Jochen

+0

これは長い答えでした。簡単な答えは、シングルトンが正当に正当化されるときのコンテキストがあるということです。しかし、しばしば、それが正当化されないときに使用されます。そして、私は確かに上記の場合それが正当化されていないと主張していた。たとえそれが害を及ぼさないとしても。 – Jochen

1

「静的」ではないこの特定のクラスには何もありません。

1つのクラスインスタンスが別の状態データを持つ瞬間は、個々のオブジェクトが必要です。

「シングルトン」は1つのことです(訳ではありません;-))。

「静的」は別のものです。

スケーラビリティは、別の別の問題です。

ボトムライン:オブジェクトであることが必要な場合は、オブジェクトにします。メソッドがインスタンスデータを参照する必要は決してありません - 是非。もしあなたが望めば、あなた自身をノックアウトし、静的な方法にしてください。

私見...

+0

私は静的なアプローチに同意しますが、このメソッドをオーバーライドしているため静的にすることはできません。私はこれらを知る必要があります。なぜなら、リポジトリの後ろに同じケースがあるからです。リポジトリは、アプリケーションがdbから何らかのエンティティを必要とするたびにビルドされます。 –

0

いけない」DO:

10,000 new BinaryCalculator().addition(42,24); 

の操作を行います。

BinaryCalculator bc = new BinaryCalculator(); 
10,000 bc.addition(42,24); 

は、あなたが使用している場合:

MemoryMXBean mBean = ManagementFactoryHelper.getMemoryMXBean(); 
mBean.getHeapMemoryUsage().getUsed() 

孤立テストでは、あなたはgetUsed()成長していると第一に縮小が表示されます例、安定した使い方が2番目にあります。また、getUsed()を使用して、ヒープがどれくらい早く使い切られ、GCされたかを知ることができます。

0

クラスの1つのインスタンスで使用されるメモリは、使用しているJVMに依存し、場合によっては他のものにも依存します。しかし、オブジェクトのヘッダは、通常、が8〜16バイトを占めます。オブジェクトに行われたことに応じて、他の隠れた状態も存在する可能性があります。例えば

  • 「膨らんだ」ロックデータ構造、
  • オブジェクトのアイデンティティのハッシュコード値の保存。

しかし、これはアプリケーションのパフォーマンスには大きな影響を与えない可能性があります。

関連する問題