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()也是非静态的时,程序也能正常运行。通过使方法静态可以获得任何性能增益或任何优势吗?
答案 0 :(得分:2)
根据一般的OOP原则,方法实际上是您的类为其实例的公共视图提供的“行为”。实例是类的“抽象存在”的真实版本。现在要理解的重要一点是实例方法是类演示的行为。阶级的行为与其“状态”有关。变量或属性。对于不同的状态值,该类的相同方法可以显示不同的行为,即:执行的操作。
因此,作为一般规则:当一个方法提供依赖于实例状态的行为并且该行为对于该类是唯一的时,它应该是非静态的并且封装在类中。这种行为应该只通过明确定义的合同向世界公开,合同通常是公共方法或类的接口。
然而,当一个方法提供不依赖于任何类或实例状态的通用行为,也不受状态变化的影响时,它应该是静态的,即:独立于任何类。一些示例是将给定日期转换为字符串,或者记录消息或转换异常等。
看看你的情况。
答案 1 :(得分:0)
原因是您可以直接访问静态方法而无需创建类
的实例答案 2 :(得分:0)
更多关于风格。 makeEvent
不访问BeatBox1
的任何字段,static
使用编译器来确保声明。
就表现而言,几乎没有差别。编译器将添加this
作为非静态方法的第一个参数,即访问字段的方式,但这不应对性能产生实际影响。