在java中导入静态Singleton没有错误

时间:2013-09-16 20:17:54

标签: java

我跟随过辛格尔顿:

public class GameConfig {

    private static GameConfig mGameConfig = null;

    private String mStr = "Boo";

    public static GameConfig getInstance(){

    if(mGameConfig == null){
        mGameConfig = new GameConfig();
    }

    return mGameConfig;
}

    private GameConfig(){}

    public String getStr() {
      return mStr;
    }
}

现在我尝试做一些实验:

假设我有其他课程User可以使用这个singelton:

public class User{

  ....

  private void init(){
    String str = GameConfig.getInstance().getStr();
  }

}

到目前为止一切顺利。

我将上面提到的课程User并添加import static

import static com.app.utils.GameConfig.getInstance; // no error, why?? 

public class User{

  ....

  private void init(){
    String str = GameConfig.getInstance().getStr();

    //  I can't type 
    // String str = getStr(); !!
    // getInstance return instance
  }
}

4 个答案:

答案 0 :(得分:3)

为什么没有错误?因为那是有效的语法。工作不是很好吗?

import static com.app.utils.GameConfig.getInstance; // no error, why?? 

将在不命名类的情况下使getInstance()可用,例如:

GameConfig gc=getInstance();

作为旁注,我会将该方法重命名为更具描述性,例如getGameConfig

答案 1 :(得分:2)

Java语言规范有答案。首先,the definition of a member

  

一个类体可能包含该类成员的声明   是,字段(§8.3),方法(§8.4),类(§8.5)和接口   (第8.5节)。

     

类主体也可能包含静态的实例初始值设定项(第8.6节)   初始化器(第8.7节)和构造函数声明(第8.8节)   类。

definition of a single static import

  

单静态导入声明导入所有可访问的静态   具有类型的给定简单名称的成员。这使得这些是静态的   成员在类和接口中以其简单名称提供   单一静态导入的编译单元的声明   声明出现了。

     

SingleStaticImportDeclaration:

import static TypeName . Identifier ;

static方法getInstancestatic类的GameConfig成员。因此,您可以使用

导入它
import static com.app.utils.GameConfig.getInstance;

如果在下面

//  I can't type 
// String str = getStr(); !!

你的意思是getStr()成为static的{​​{1}}方法,因为你没有导入该成员,所以它无法编译是有意义的。

答案 2 :(得分:1)

没有错误,因为静态导入是有效的。静态导入允许从类中导入静态内容。这允许直接使用静态变量/方法而不使用类名。

此外,您无法直接使用getStr,因为这不是static方法。

答案 3 :(得分:0)

因为它是一个有效的静态导入。所以没有错误 根据java static import

  

静态导入构造允许对静态成员进行非限定访问,而不从包含静态成员的类型继承。相反,程序会单独导入成员。在

此处getInstance()static成员,因此它是有效的import语句。