這是一個關於編寫java類以及它們是如何實例化的常見問題。java類的寫作和對象構造
public class transaction
{
int amount;
char ref;
}
如果一個類是這樣寫的,那麼它可以像結構一樣使用。然後,當數據通過網絡以數據報中的字節[]傳輸時,它會被轉換爲事務對象。一個地方做,這是一個單獨的類,這樣說:
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);
...
}
但現在我想的類數據和方法保持在一起一個地方(據推測它應該是這樣的?),所以不要在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);
...
}
,表面上一切如故有同樣的效果。
我的問題是:在將事務數據(金額和ref)上的操作fromByte(byte[] buf)
添加到transaction
類中之後,實例化transaction
對象更改的開銷。如果每秒有數百次交易來自網絡,那麼將fromByte(byte[] buf)
方法添加到transaction
類意味着當它在doStuff
類中實例化時,將會有比以前更多的開銷。換句話說,而不是簡單地生成int
和char
(如在該數據段的靜態變量)它在堆上(我想,而不是將數據段)中產生的doStuff
類生成foo
然後每個時間和進一步fromByte(buf)
方法被推入堆棧,然後transaction
類再次在數據段上自動調用自身(一個靜態變量)...
好吧,它似乎有點亂。有沒有更好的方法把數據和方法放在同一個班,並保持最高速度?它可以通過遞歸變量調用(fromByte方法返回一個事務對象,這在'int/char'表單中可以)任何評論? :-)
爲什麼創建「事務」的開銷發生了變化? –
你的意思是說'事務t'是靜態的嗎? –
好吧,這真的是一個問題...如果你添加一個方法到一個類,所以有類中的數據和方法,那麼當類實例化更多的東西發生在引擎蓋下,對吧? – rupweb