遇到了一个问题:
public class DaoFactory{
private static DaoFactory instance = new DaoFactory();
private static UserDao userDao = null;
private DaoFactory(){
try{
Properties prp = new Properties();
InputStream in = new FileInputStream(new File("src/dbconfig.properties"));
prp.load(in);
String userDaoClass = prp.getProperty("UserDaoClass");
userDao = Class.forName(userDaoClass).newInstance();
}catch(Exception e){
throw new RuntimeException("类初始化有误");
}
public static DaoFactory getInstance(){
return this.instance;
}
public UserDao getUserDao(){
return this.userDao;
}
}
}
调用:
public class DaoFactoryTest{
public static void main(String[] args){
UserDao userDao = DaoFactory.getInstance().getUserDao();
System.out.println(userDao);
}
}
这样子调用居然会出现null指针异常。
重新分析了一下代码才发现,原来出错的地方是这样的,没有注意到代码块加载的顺序,其实是这样的 静态属性static首先被加载
private static DaoFactory instance = new DaoFactory();
private static UserDao userDao = null;
也就是说两个静态属性都首先加载了,但是初始化是有顺序的,从上到下,先初始化第一个静态属性,instance被初始化以后,userDao也就初始化有值了,但是接着又对userDao初始化,也就是第二句,再次把userDao赋值为null,所以当我们在调用的时候,返回的就是一个空结果了。
找到问题的源头自然也就好解决问题了,我们只需要把他们顺序换一下就好了
private static UserDao userDao = null;
private static DaoFactory instance = new DaoFactory();
这样子就能正确的返回结果了。
分享到:
相关推荐
在简单工厂模式下,我们可以创建一个"ButtonFactory"工厂类,该类内有多个方法,分别负责创建不同类型的按钮对象。这样,当需要创建一个新的按钮时,只需要调用相应的工厂方法即可,无需知道按钮的具体实现细节。 ...
工厂模式的好处在于,客户端代码无需关心产品是如何创建的,只需知道如何使用即可,提高了代码的可维护性和可扩展性。 总结: PHP 中的单例模式主要用于限制类的实例化次数,确保全局范围内只有一个实例,常用于...
这种模式通常用于需要处理 null 对象的情况下,以避免NullPointerException 异常。 在软件设计中,我们经常会遇到需要处理 null 对象的情况,例如在数据库查询中,查询结果可能为空;在网络请求中,响应结果可能为...
尽管在某些情况下可能会显得较为复杂,但在大型系统或需要频繁扩展的场景下,工厂模式的价值尤为突出。通过不断的实践和项目经验积累,开发者能够更好地理解和运用这一模式,提高软件的灵活性和可维护性。
总结来说,简单工厂模式在特定场景下能有效提高代码的可读性和可维护性,尤其是在产品种类较少且不会频繁变化的情况下。但随着产品类的增多,可能需要考虑采用更复杂的工厂模式,如工厂方法模式或抽象工厂模式,以...
**注意:**单例模式在多线程环境下需要特别注意线程安全问题,否则可能会导致创建多个实例的情况发生。 #### 2. 工厂模式 **定义:** 工厂模式定义了一个创建对象的接口,但允许子类决定实例化哪个类。工厂方法使...
- **复现问题**:首先,需要在相同的环境和条件下复现这个问题,以便收集更多的信息。 - **代码审查**:对`rf_test_task.c`和`udcif.c`等相关代码进行详细审查,查找可能导致NULL指针的原因。 - **调试**:使用...
抽象工厂模式提供了一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。当系统中存在多个产品族时,且每个产品族包含多个相关联的产品时,可以使用此模式。 #### 单例模式(Singleton Pattern...
工厂模式是一种常用的创建型模式,其核心思想是在不指定具体类的情况下创建一个对象。这种模式通过定义一个用于创建对象的接口,让子类决定实例化哪一个类。这种方式降低了系统的耦合度。 **如何工作:** - 定义一...
- 常见设计模式的应用:单例模式、工厂模式、观察者模式等,提高代码的复用性和扩展性。 - SOLID原则:单一职责、开闭原则、里氏替换、接口隔离和依赖倒置,是设计模式的基础。 7. **单元测试**: - JUnit与...
`,因为没有`agent`类型的`Order`,会抛出异常`Exception("no suitable order type")`,并在finally块中显示`created 0 order`,因为`order`是null。 - UML类结构图未给出,但根据代码,可以绘制如下: ``` +----...
- **双重检查锁定**:为了解决性能问题,通常采用双重检查锁定来优化,但这在Java语言中可能会出现问题,因为Java的内存模型和类加载机制的原因。 #### 三、登记式单例类 登记式单例类通过维护一个映射表(如...
Java 基础面试问题涉及了并发编程、持久层框架以及集合操作等核心知识点。...在实际面试中,还可能涉及其他 Java 核心概念,如异常处理、IO 流、多线程模型、设计模式等,这些都是评估开发者技能的重要方面。
- **工厂模式/构造器模式**: - 提供一种封装对象创建的方式,隐藏复杂的创建逻辑。 #### 6. 多线程的表示方法及同步实现方法 - **多线程表示方法**: - 继承`Thread`类。 - 实现`Runnable`接口。 - 使用`...
- 常用设计模式如工厂模式、单例模式、观察者模式等应熟练掌握并合理应用。 - 避免过度设计,根据实际情况选择合适的设计模式。 8. **日志记录**: - 日志级别分为`TRACE`、`DEBUG`、`INFO`、`WARN`、`ERROR`,...
- **工厂模式**:了解简单工厂、工厂方法和抽象工厂模式。 - **代理模式**:理解静态代理和动态代理(JDK动态代理、CGLIB)。 9. **JVM** - **类加载机制**:知道双亲委派模型,以及如何自定义类加载器。 - **...
简单工厂模式是软件设计模式中的一种,它提供了一种创建对象的最佳方式,特别是在当你知道所需的类,但不想或者不希望显式地指定它的类名时。这个模式属于创建型模式,其主要目的是为了隔离对象创建过程,使得客户端...
- 常用的设计模式如工厂模式、单例模式、观察者模式等,都有其特定的应用场景和注意事项。 - 避免过度设计,根据实际需求选择合适的设计模式。 9. **单元测试**: - 每个类的重要方法都应有对应的单元测试,确保...
- 设计模式是解决常见问题的模板,面试中可能涉及单例模式、工厂模式、观察者模式、装饰者模式等。 - 单例模式确保类只有一个实例,通常用在配置类、缓存管理等场景。 - 工厂模式用于创建对象,提供统一的接口,...
- **finally**:即使出现异常,finally块中的代码也会被执行。 - **implements**:接口实现的关键字。 - **instanceof**:判断对象是否为指定类型的实例。 - **static**:表示静态成员或静态方法,可以在没有创建...