MST

星途 面试题库

面试题:Java中访问控制修饰符在设计模式中的应用

在Java编程中,有public、private、protected以及默认(不写修饰符)这几种访问控制修饰符。请举例说明在单例设计模式中,如何合理使用访问控制修饰符来保证单例的唯一性和安全性,并阐述每种修饰符在此场景下的作用。
28.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

单例模式中访问控制修饰符的使用

  1. 使用private修饰构造函数
    • 示例代码
public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // 私有构造函数,防止外部实例化
    }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
- **作用**:`private`修饰的构造函数确保类不能在外部通过`new`关键字实例化,只有类自身内部可以调用构造函数来创建实例,从而保证单例的唯一性。

2. 使用private修饰单例实例变量 - 示例代码

public class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
- **作用**:`private`修饰的`instance`变量,阻止外部代码直接访问和修改该变量,防止意外地创建新的实例或破坏单例的状态,保证了单例的安全性。

3. 使用public修饰获取单例实例的方法 - 示例代码

public class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
- **作用**:`public`修饰的`getInstance`方法为外部代码提供了唯一获取单例实例的入口,使得其他类能够方便地获取单例对象,同时又保证了单例的唯一性。

4. 默认访问控制修饰符(包访问权限) - 示例场景:假设在同一个包内有多个类需要相互协作,且这些类内部的某些方法或成员变量不需要暴露给其他包使用。例如,单例类内部可能有一些辅助方法,只供包内其他类使用。

// 假设这个类和Singleton类在同一个包内
class Helper {
    // 包访问权限的方法,只能在同一个包内被调用
    void assist(Singleton singleton) {
        // 辅助操作
    }
}
- **作用**:在单例模式场景下,如果单例类需要与包内其他类协作,默认访问控制修饰符可以提供一种适度的访问控制,允许包内的其他类访问单例类的某些成员,同时避免这些成员被其他包的类随意访问,在一定程度上保证了安全性和封装性。但如果单例类设计为全局唯一且严格控制访问,默认访问控制修饰符使用场景相对较少,因为它可能会破坏单例的严格封装性。

5. protected修饰符在单例模式中的情况 - 作用:在单例模式下,protected修饰符通常较少使用。因为单例模式强调唯一性和全局访问的一致性,protected修饰的成员主要用于继承场景,允许子类访问。但单例模式一般不希望被继承(否则可能破坏单例的唯一性),所以protected修饰符在此场景下不是核心需求。若非要使用,例如单例类希望某些内部操作在子类中可被重写扩展,但又不想完全暴露给外部,可将相关方法或成员设为protected。然而,这种情况可能需要更谨慎设计,以避免破坏单例特性。