これは、Javaクラスの記述とそれらがどのようにインスタンス化されるかについての一般的な質問です。
public class transaction
{
int amount;
char ref;
}
クラスがこのように記述されている場合は、構造体のように使用できます。次に、データがデータグラムのbyte []としてネットワークを経由すると、トランザクションオブジェクトに変換されます。これを行う1つの場所は、別のクラスにあります。たとえば、次のようになります。
public class doStuff
{
static transaction t; // the int and the char are alloc'd onto the DataSegment
public static transaction fromByte(byte[] buf)
{
t = new transaction(); // make sure t is null to begin with (on the heap)
t.ref = ''; // initialise char (to avoid null bytes)
t.amount = ByteBuffer.wrap(buf).getInt();
t.ref = ByteBuffer.wrap(buf).getChar();
return t;
}
}
次に、別のクラスが次のようにdoStuffを呼び出します。
import doStuff;
class otherClass extends Thread
{
static transaction x = new transaction();
... in the run method
x = doStuff.fromByte(buf);
...
}
しかし、今はクラスのデータとメソッドを1か所にまとめたいので(おそらくそうあるべきですか?)、doStuffクラスにfromByte(byte [] buf)メソッドを含める代わりに、トランザクションクラスに移動します。したがって、トランザクションクラスは次のようになります。
public class transaction
{
int amount;
char ref;
static transaction t;
public static transaction fromByte(byte[] buf)
{
t = new transaction(); // make sure t is null to begin with
t.ref = ''; // initialise char (to avoid null bytes)
t.amount = ByteBuffer.wrap(buf).getInt();
t.ref = ByteBuffer.wrap(buf).getChar();
return t;
}
}
次に、otherClassで使用します。
import transaction;
class otherClass extends Thread
{
static transaction x = new transaction();
... in the run method
x = fromByte(buf);
...
}
表面的には、すべて以前と同じ効果があります。
私の質問は次のとおりです。fromByte(byte[] buf)
トランザクションデータ(amountとref)に対する操作をクラスに追加すると、オブジェクトtransaction
をインスタンス化するためのオーバーヘッドが変更されます。transaction
ネットワークから1秒あたり数百のトランザクションが発生した場合、fromByte(byte[] buf)
メソッドをtransaction
クラスに追加すると、クラスでインスタンス化されたときにdoStuff
、以前よりも多くのオーバーヘッドが使用されることになります。言い換えると、クラスが生成するたびに(データセグメントの静的変数として)単にanint
とaを生成するのではなく、ヒープ(データセグメントではなく)で生成され、さらにメソッドがスタックにプッシュされますそして、char
doStuff
foo
fromByte(buf)
transaction
クラスは、データセグメントで自分自身を再帰的に再度呼び出します(静的変数)。..
まあそれは少し混乱しているようです。データとメソッドを同じクラスに入れて最大速度を維持するためのより良い方法はありますか?再帰変数呼び出しを乗り越えることができますか(fromByteメソッドはトランザクションオブジェクトを返し、「int / char」形式で問題ありません)コメントはありますか?:-)