package com.test;
import java.io.StringReader;
import java.util.HashMap;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
public class Random {
/**
* @param args
*/
public static void main(String[] args) {
HashMap<String, String> values = new HashMap<String, String>();
String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><user><kyc>123</kyc><address>test</address><resiFI>asds</resiFI></user>";
Document xml = convertStringToDocument(xmlString);
Node user = xml.getFirstChild();
NodeList childs = user.getChildNodes();
Node child;
for (int i = 0; i < childs.getLength(); i++) {
child = childs.item(i);
System.out.println(child.getNodeName());
System.out.println(child.getTextContent());
values.put(child.getNodeName(), child.getTextContent());
}
}
private static Document convertStringToDocument(String xmlStr) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
try {
builder = factory.newDocumentBuilder();
Document doc = builder.parse(new InputSource(new StringReader(
xmlStr)));
return doc;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
Это сработает. Пожалуйста, проверьте :) Вы можете играть с DOM.
__construct()
был бы только назван, если бы Вы назвали его из метода для класса, содержащего частного конструктора. Таким образом для Вашей Singleton, у Вас мог бы быть метод как так:
class DBConnection
{
private static $Connection = null;
public static function getConnection()
{
if(!isset(self::$Connection))
{
self::$Connection = new DBConnection();
}
return self::$Connection;
}
private function __construct()
{
}
}
$dbConnection = DBConnection::getConnection();
причина, Вы в состоянии/, хочет инстанцировать класса из себя, то, так, чтобы можно было проверить, чтобы удостовериться, что только один экземпляр существует в любой момент времени. Это - смысл Singleton, в конце концов. Используя Singleton для соединения с базой данных гарантирует, что Ваше приложение не делает тонну из соединений с БД за один раз.
<час>Редактирование: Добавленный $, как предложено @emanuele-del-grande
Немного выбора гниды: Для полноты Вы были бы, вероятно объявлять класс как финал также, так как Вы не хотели бы кого-то разделяющего этот класс на подклассы и реализующий его собственного общедоступного конструктора.
(Прощают мне, если компилятор ловит переопределение частного конструктора, но я не думаю, что это делает)
Протестируйте код, Mark, и сообщите мне то, что Вы узнаете.
РЕДАКТИРОВАНИЕ: Кроме того, в этой конкретной ситуации я не уверен, почему Вы должны были бы быть обеспокоены препятствованием тому, чтобы человек разделил на подклассы. Если у кого-то есть доступ к Вашему коду PHP для разделения на подклассы его, то у них также есть доступ к коду для копирования его и модификаторы доступа изменения к чему-то, что они (по любой причине) находят подходящими.
практическая полноценность Singleton в этом случае - то, что при помощи ее можно удостовериться, что Вы всегда используете то же соединение с базой данных для данного Запроса HTTP. Это выполняет это. Другой материал (использующий final
и частные конструкторы) полезен, чтобы знать с точки зрения теории, и еще более полезный знать, хотите ли Вы распределить код качества API другим программистам, но в случае этого конкретного примера, делают все ключевые слова, добавляют байты к Вашему размеру файла класса.
Вот очень простой одиночный элемент, который просто генерирует дату/строку времени:
class TheDate
{
private static $DateInstance = null;
private $dateVal;
public static function getDateInstance()
{
if(!isset(self::$DateInstance))
{
self::$DateInstance = new TheDate();
}
return self::$DateInstance;
}
public static function getDateVal()
{
return self::$DateInstance->dateVal;
}
private function __construct()
{
$this->dateVal = strftime("%Y-%m-%d %H:%M:%S");
}
}
Выполнение чего-то вроде этого, очевидно, дает мне ту же дату много раз:
$date1 = TheDate::getDateInstance();
echo $date1->getDateVal() . "<br />";
$date2 = TheDate::getDateInstance();
echo $date2->getDateVal() . "<br />";
И выполнение этого не генерирует ошибок:
class NewDate extends TheDate
{
public function __construct()
{
}
}
Хорошо, я запустил некоторые мои собственные тесты.
mysql_connect()
функция (или некоторая другая ссылка на некоторый другой RDBMS), пока Вы отмечаете частный экземпляр, нет никакой угрозы кого-то разделяющего его на подклассы и вмешивающийся в ссылку.