有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓这个私有方法在这个单例Java类中做什么?

我有一个singleton类,功能非常好。我现在只是想知道最后一种方法是什么

public class PicassoSingleton {
    private static Picasso instance;

    public static Picasso with(Context context) {
        if (instance == null) {
            instance = new Picasso.Builder(context.getApplicationContext()).debugging(true).downloader(new ImageDownloader(context)).build();
        }
        return instance;
    }

    private PicassoSingleton() {
        throw new AssertionError("No instances.");
    }
}

有人知道它的用途吗


共 (6) 个答案

  1. # 1 楼答案

    PicassoSingleton在这里是一个构造函数,通过将其私有化,可以限制其他类实例化它

    这使得构造函数对其他类不可用,并且只能通过getInstance方法访问该类的实例

  2. # 2 楼答案

    private PicassoSingleton() {
        throw new AssertionError("No instances.");
    }
    

    构造函数是私有的,因此不能使用new关键字创建类的新实例

  3. # 3 楼答案

    通常,让构造函数private来防止其他类实例化PicassoSingleton就足够了

    在私有构造函数中抛出异常似乎是一种偏执编程,因为类的实现者知道它的内部细节,并且必须知道自己在做什么

    但有一个原因是有道理的。在构造函数中抛出异常也将阻止其他人使用反射来实例化类的对象

    这是不可能的

    Constructor<PicassoSingleton> constructor = PicassoSingleton.class.getDeclaredConstructor();
    constructor.setAccessible(true);
    constructor.newInstance();  // will throw the AssertionError - impossible to instantiate it
    
  4. # 4 楼答案

    这是PicassoSingleton类的构造函数。它是私有的,以确保你不能从其他代码调用它。相反,您可以使用with方法来获取该类的单例实例

  5. # 5 楼答案

    它防止类被实例化,如果没有指定构造函数,那么默认情况下,所有类都可以使用new PicassoSingleton()创建一个新实例,而不带任何参数

    如果指定构造函数并使其private,则只有类本身可以创建自身的实例。如果随后在构造函数中抛出异常,则即使该类也无法实例化自身,并且它会阻止使用反射的人这样做

    这样做本质上意味着该类可以提供静态方法、变量等,但永远不能用作对象(除非您提供另一个构造函数,在这种情况下,该构造函数的访问级别可能允许使用它)

  6. # 6 楼答案

    除了Tim B答案之外,我想说的是,不仅要防止这个类被用作对象,还要防止其他类扩展它

    无论您如何不必在构造函数中抛出异常,您都可以将其留空,这样做的唯一原因是保护您自己