[英]Are there any advantages of making the method makeEvent() static?
package hf;
import javax.sound.midi.*;
public class BeatBox1
{
public static void main(String[] args)
{
BeatBox1 boom = new BeatBox1();
boom.go();
}
public void go()
{
try
{
Sequencer player = MidiSystem.getSequencer();
player.open();
Sequence seq = new Sequence(Sequence.PPQ,4);
Track track = seq.createTrack();
for(int i = 5;i<125;i+=5)
{
track.add(makeEvent(144,i,i));
track.add(makeEvent(128,i,i+2));
}
player.setSequence(seq);
player.start();
}
catch(Exception e)
{
System.out.println("Problem starting the BeatBox");
}
}
public static MidiEvent makeEvent(int onOff,int note,int time)
{
MidiEvent event = null;
try
{
ShortMessage a = new ShortMessage();
a.setMessage(onOff,1,note,100);
event = new MidiEvent(a,time);
return event;
}
catch(Exception e)
{
System.out.println("Error in creating Event.");
}
return event;
}
}
我在一本書中找到了上面的示例代碼。 他們建議使makeEvent方法為靜態。 是什么原因?
當makeEvent()也設為非靜態時,程序也可以正確運行。 通過使該方法靜態化,是否可以獲得任何性能提升或優勢?
根據一般的OOP原則,方法實際上是您的類向其實例的公共視圖提供的“行為”。 實例是該類“抽象存在”的真實版本。 現在,在這里要了解的重要一點是,實例方法是類演示的行為。 該類的行為與其“狀態”相關。 變量或屬性。 對於不同的狀態值,類的相同方法可以顯示不同的行為,即:執行的操作。
因此,通常的規則是:當一個方法提供的行為取決於實例的狀態,並且該行為對於該類是唯一的時,它應該是非靜態的,並封裝在該類中。 只有通過明確定義的合同(通常是公共方法或類的接口)才能將這種行為暴露給世界。
但是,當方法提供的通用行為既不受任何類或實例狀態的束縛,也不受狀態變化的影響時,則應為靜態,即:獨立於任何類。 一些示例將給定日期轉換為字符串,或登錄消息,或轉換異常等。
看看適合您的情況。
原因是您可以直接訪問靜態方法而無需創建類的實例
更多關於風格。 makeEvent
不訪問任何領域BeatBox1
,和static
使用編譯器,以保證要求。
就性能而言,幾乎沒有差異。 編譯器將添加一個this
作為非靜態方法的第一個參數,這是訪問字段的方式,但這不會對性能產生實際影響。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.