0

我关注了单例:

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可以使用这个单例:

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

4 回答 4

3

为什么没有错误?因为这是有效的语法。事情不是很好吗?

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

将在getInstance()不命名类的情况下提供,例如:

GameConfig gc=getInstance();

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

于 2013-09-16T20:19:35.167 回答
2

Java 语言规范给出了答案。一、成员的定义

类体可能包含类成员的声明,即字段(第 8.3 节)、方法(第 8.4 节)、类(第 8.5 节)和接口(第 8.5 节)。

类主体还可以包含类的实例初始化器(第 8.6 节)、静态初始化器(第 8.7 节)和构造函数声明(第 8.8 节)。

定义单个static导入

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

SingleStaticImport声明:

import static TypeName . Identifier ;

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

import static com.app.utils.GameConfig.getInstance;

如果在下面

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

你的意思是getStr()成为static方法GameConfig,它不会编译是有道理的,因为你还没有导入那个成员。

于 2013-09-16T20:21:41.497 回答
1

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

你也不能getStr直接使用,因为那不是一种static方法。

于 2013-09-16T20:21:07.593 回答
0

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

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

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

于 2013-09-16T20:26:18.230 回答