Java 为什么我不能实例化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

我试图使用LocationManager类做一些工作,但发现我无法实例化它


它不是一个抽象类,我的印象是只有标记为抽象的类才能被实例化

要获得更完整的答案:

如果你看一下,特别是第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的了解,这让我有点困惑。我使用谷歌,但没有太多的时间,所以我点击的每一个链接都不会给出答案。给赛尔夫的提示:下次再看源代码。