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

时间:2013-12-24 10:07:13

标签: java android 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.");
    }
}

有人知道它的作用或用途是什么吗?

7 个答案:

答案 0 :(得分:8)

通常,使构造函数private阻止其他类实例化PicassoSingleton就足够了。

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

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

这是不可能的

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

PicassoSingleton是一个构造函数,通过将其设置为私有,您可以限制其他类来实例化它。

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

答案 5 :(得分:0)

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

你怎么不必在构造函数中抛出异常就可以把它留空,唯一的理由就是保护自己。

答案 6 :(得分:0)

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

此方法用于访问私有字段“instance”,它是静态bcoz,然后您可以使用其类名直接访问它而无需创建对象。它是一种公共方法,因为您可能需要从当前包的外部访问它。最初检查实例变量是否为null。如果为null,则它尚未启动。然后它将创建一个新的对象并启动它。最后返回实例对象引用。这种方法在编程中被称为访问方法。

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

这是PicassoSingleton类的构造函数。根据Singleton设计模式定义的理论,它不应该允许制作类的对象。为此,我们可以创建一个私有构造函数。 private修饰符只能在同一个类中访问。所以在开发时有人错误地为这个类创建了一个实例,它会通过告诉“No Instances”来抛出Assertion Error

希望你明白我的意思。

最后关于类字段的一个词

private static Picasso instance;

此对象引用变量是保存对象引用。并且它是私有的,以限制来自课外的访问。它是静态参考bocz,它是从静态方法访问。