我跟随过辛格尔顿:
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
}
}
答案 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
方法getInstance
是static
类的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语句。