Java 为什么我不能实例化LocationManager类?
我试图使用LocationManager类做一些工作,但发现我无法实例化它Java 为什么我不能实例化LocationManager类?,java,android,access-control,Java,Android,Access Control,我试图使用LocationManager类做一些工作,但发现我无法实例化它 它不是一个抽象类,我的印象是只有标记为抽象的类才能被实例化 要获得更完整的答案: 如果你看一下,特别是第303行,你会发现它实际上有一个公共构造函数。。。但有一个特别的注释: /** * @hide - hide this constructor because it has a parameter * of type ILocationManager, which is a system private class
它不是一个抽象类,我的印象是只有标记为抽象的类才能被实例化 要获得更完整的答案: 如果你看一下,特别是第303行,你会发现它实际上有一个公共构造函数。。。但有一个特别的注释:
/**
* @hide - hide this constructor because it has a parameter
* of type ILocationManager, which is a system private class. The
* right way to create an instance of this class is using the
* factory Context.getSystemService.
*/
public LocationManager(Context context, ILocationManager service) {
mService = service;
mContext = context;
}
@hide注释将构造函数排除在Javadoc之外,IDE不会显示它。你可以
基本上,类的设计是为了从上下文中获得它,而不是自己实例化它。这是一种非常常见的设计,用于需要复杂或特定于平台的配置,而您希望避免让用户处理这些配置
请注意,@hide注释及其处理是特定于Android的
这类似于Builder或Factory模式的工作方式,其中只有Builder/Factory类可以实例化对象,尽管在Java中通常使用私有或包私有构造函数来实现:
public class MyWidget
{
private final Foo someObject;
// ... more stuff
private MyWidget(Builder builder)
{
this.someObject = builder.someObject;
// ... more stuff
}
public static class Builder
{
Foo someObject;
public Builder() {}
public Builder withFoo(Foo someObject)
{
this.someObject = someObject;
return this;
}
public MyWidget build()
{
return new MyWidget(this);
}
}
}
它被调用为:
MyWidget widget = new MyWidget.Builder().withFoo(someFoo).build();
可能它的构造函数是私有的,如果它是私有的,你不能在类之外初始化,构造函数是私有的。您必须从ContextgetSystemServiceContext.LOCATION\u服务获取系统的LocationManager服务;您不能直接实例化它,但您正在使用的其他东西可以并执行文档的第二段。这是一种简单的访问控制,非常常见。这是我错过的,但从未意识到的。谢谢各位,继续关注投票结果,这里的每个人都应该是约翰·卡马克。谢谢你们。我从那篇文章中学到了很多。非常欣赏真实的故事;我也是。我只玩了一点安卓,并期待着标准的习惯用法,其中构造函数是私有的或包私有的——这是我期待的答案,直到我查看源代码。这其实是一个有趣的事情,我不知道关于Android:是的,哈哈。问这个问题我觉得很傻,但回想起我对java的了解,这让我有点困惑。我使用谷歌,但没有太多的时间,所以我点击的每一个链接都不会给出答案。给赛尔夫的提示:下次再看源代码。