是否有制作方法makeEvent()静态的任何好处?(Are there any advantage

2019-10-21 09:03发布

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()是由非静态以及该程序正常运行。 有没有办法,可以通过使静态方法来获得任何性能增益或优势?

Answer 1:

基于一般OOP原则,方法实际上是一种“行为”,你的类提供了它的实例的公众意见。 一个实例是类的“抽象存在”的现实生活版。 我们了解这里的重要的事情是实例方法是该类演示行为。 类的行为依赖于它的“状态”,即。 变量或属性。 对于状态的不同的值的类的方法相同的方法可以显示出不同的行为,即:操作来执行。

因此,作为一般规则:当一个方法提供了一个行为都依赖于实例的状态和行为是唯一的类应该是非静态的和在类封装。 这样的行为应该仅通过良好定义的合同,通常是一个公共方法或类的接口被暴露给世界。

然而,当一个方法提供了通用的行为不依赖于任何类或实例状态也不在状态变化的影响应该是静态的,即:独立于任何类的。 一些实例在给定日期转换为字符串,或洛的消息,或异常转化等

看看有什么适合你的情况。



Answer 2:

原因是,你可以访问到静态方法的情况下直接创建类的实例



Answer 3:

它更多的是风格。 makeEvent不访问任何领域BeatBox1 ,和static使用编译器,以保证要求。

就性能而言,会有一点没有差别。 该编译器将添加this作为非静态方法的第一个参数,这是多么字段的访问,但是这不应该对性能产生真正的影响。



文章来源: Are there any advantages of making the method makeEvent() static?
标签: java static midi