簡體   English   中英

使方法makeEvent()靜態有什么好處?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM