Java объект нулевой после экземпляра и вызова внутри метода
Может кто-нибудь помочь мне с этим вопросом, я работаю с Java с помощью SQLMap(ibatis). у меня есть 3 класса, который является MainConfiguration, SQLMap, DBUtility.
- Основная конфигурация (этот класс используется для установки объекта внутри класса SQLMap)
public class MainConfiguration
{
public static String file = "configuration/db/SQLMapConfig.conf";
public static void main(String[] args) throws Exception
{
new MainConfiguration().loadConfiguration();
}
public static void loadConfiguration()
{
SQLMap.setMapFile(file);
List list = DBUtility.loadUsers();
}
}
- Карта SQL (этот класс является геттером и сеттером и объекта)
public final class SQLMap
{
private static SqlMapClient sqlMap;
public static void setMapFile(String sMapFile)
{
try
{
sqlMap = SqlMapClientBuilder.buildSqlMapClient(new FileReader(sMapFile));
}
catch (Exception e)
{
throw new RuntimeException("Error initializing SqlMapClient class", e);
}
}
public static SqlMapClient getSqlMapInstance()
{
return sqlMap;
}
}
DBUtility (это класс, где экземпляр объекта и получить объект из класса SQLMap)
public class DBUtility { // object utility protected static SqlMapClient sqlMap = SQLMap.getSqlMapInstance(); //constructor public DBUtility() throws Exception { } public static List loadUsers() { //it's working logger.info("SQLMap Get Instance = " + SQLMap.getSqlMapInstance()); //it's not working logger.info("SQLMap Get Instance = " + sqlMap); //code below will be error because of null sqlMap try { listUser = sqlMap.queryForList("getUsers"); } catch (Exception sqle) { logger.error("Error on load all user", sqle); } return listUser; } }
регистратор дай мне это:
SQLMap Get Instance = com.ibatis.sqlmap.engine.impl.SqlMapClientImpl@76707e36
SQLMap Get Instance = null
почему второй журнал дает мне ноль, даже если у меня есть экземпляр объекта?
1 ответ
Ваше поле sqlMap
инициализируется при загрузке класса DBUtility, что, по-видимому, происходит раньше SQLMap.setMapFile(file);
называется. Так, sqlMap
указывает на разные вещи: null
в статическом поле, и фактический экземпляр, когда вы вызываете геттер в loadUsers()
,
Проблема в том, что DBUtility
смотрит вверх sqlMap
слишком рано. Это должно ждать, пока file
передается SQLMap
, Измените свой код следующим образом, чтобы отложить инициализацию DbUtility.sqlMap
:
public static void loadConfiguration()
{
SQLMap.setMapFile(file);
DBUtility.initMapClient(); // notify DBUtility
List list = DBUtility.loadUsers();
}
public class DBUtility
{
protected static SqlMapClient sqlMap; // do not initialize too early
public static void initMapClient()
{
sqlMap = SQLMap.getSqlMapInstance(); // wait for SQLMap to be ready
}
Конечно, было бы проще, если бы у вас даже не было sqlMap
поле в DBUtility. Просто позвони SQLMap.getSqlMapInstance()
каждый раз, когда вам это нужно. Это особенно важно в случае изменения экземпляра:
listUser = SQLMap.getSqlMapInstance().queryForList("getUsers");
Читать Когда инициализируются статические переменные? для более подробного объяснения статических полей.