面试题答案
一键面试单例模式中访问控制修饰符的使用
- 使用
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
。然而,这种情况可能需要更谨慎设计,以避免破坏单例特性。