我是否正确使用Java中的静态方法?

时间:2015-03-19 15:09:12

标签: java oop methods static

我在Java中创建简单的游戏,在后台播放音乐。

Music class包含那些静态方法:

  • playMusic();
  • stopMusic();
  • changeVol(int vol);

在一开始我就开始设置' 音乐'' 我打电话给静态方法' playMusic ':

    new Music();    
    Music.playMusic();

这些方法是静态的原因是我想在应用程序启动时开始播放音乐,但您可以选择是否在设置中播放音乐。静态方法提供了最简单的方法,因为' 设置'班级确实没有' 主要'方法。

音乐类代码:

public class Music {
/// ... variables   

public Music(){     
    try{
        /// ... Preparing clip to play
        } catch (Exception e){
            /// ... Catching exception
        }
}

public static void playMusic(){
     /// ... starting music       
}

public static void stopMusic(){
      /// stoping music
}

public static void changeVol(int vol){
    /// changing volume 
}}

它工作得很好,但我想知道它是否与OOP和Java标准一致?

完整音乐课程代码:http://pastebin.com/d9XYX1gG

3 个答案:

答案 0 :(得分:3)

你可能想要做的是这样的事情:

Music music = new Music();
music.playMusic();

这里不需要静态方法。

如果您只想要一个可以从多个地方访问的实例,请尝试使用Singleton:

public class Music {

    private static instance Music instance;

    private Music() {
        // initialize your stuff here
    }

    // have your instance methods here

    /**
      * This is the method to access the Music singleton
      */
    public static Music getInstance() {
        if (instance == null) {
            instance = new Music();
        }
        return instance;
    }
}

答案 1 :(得分:2)

不,您不需要创建一个对象来调用静态方法。所以......

Music.playMusic();

...无需先创建新实例即可正常工作。

我也不相信这里真的需要静电。您可以初始化程序,阅读设置等,然后根据设置创建音乐对象并启动音乐。

答案 2 :(得分:2)

不,这不是使用OOP的正确方法。通过使用static关键字,您使类具有不需要对象的方法,并且不会有任何数据封装(在实例级别上)。

如果你想使用静态方法,你可以写Music.playMusic(),但不会调用你的构造函数。当您使用静态方法时,您无权访问实例变量,因此您在静态方法中可能无法访问您在构造函数中准备的任何内容,因为您无法使用this关键字。

理想情况下,您应该从每个方法中删除静态,将任何您想要的内容传递给构造函数(如果需要),然后调用:

//assume file is a music file
Music music = new Music(file);
music.playMusic();

这将使用传递的音乐文件假设您在构造函数中准备的内容。如果您在整个计划中只有其中一个,则可以使用Singleton Pattern

如果你仍然想要走静态路线并且你需要在调用任何静态方法之前准备一次,你应该使用所谓的class initializer。要使用此功能,您需要删除构造函数,因为您不需要初始化对象,而是使用类似于此类的方法替换它:

static{
    try{
        /// ... Preparing clip to play
     } catch (Exception e){
        /// ... Catching exception
     }
 }

请记住,在调用类中的任何方法(静态或对象级别)之前,保证类初始值设定项运行,但是在加载类时运行,而不是在第一次调用静态方法时运行