powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Создание enum
21 сообщений из 21, страница 1 из 1
Создание enum
    #37912930
ErikI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я переучиваюсь на Java. Хочу написать наследника который работает с полями и их значения ми. У меня 3 наследника все с разными полями. Хочется иметь возможность перебивать эти поля в родителе.
В Delphi я делал так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
TCmtsTable    = (tbStat, tbuSnr, tbIP);
TCmtsValue = packed Array[TCmtsTable] of Integer;
CmtsValue: TCmtsValue;
...
const
  OIDIP		= '1.3.6.1.2.1.10.127.1.3.3.1.3';
  OIDStat		= '1.3.6.1.2.1.10.127.1.3.3.1.9';
  OIDuSnr 		= '1.3.6.1.2.1.10.127.1.3.3.1.13';
  OIDCmtsCmPtr	= '1.3.6.1.2.1.10.127.1.3.7.1.2';

Var
		OIDCmts: Array[TCmtsTable] of String = (OIDStat, OIDuSnr, OIDIP);


и далее работал CmtsValue и OIDCmts подставляя tbStat или индекс.
В java я думаю можно сделать удобнее используя enum.

Написал такой класс:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
abstract class TTable
{
    public int Id;
    public static TTable getInstance(String key)
    {
        if (key.equals("addresses")) { return new TAddresses(); }
        else if (key.equals("flags")){ return new TFlags();     }
        else if (key.equals("users")){ return new TUsers();     }
        else {return null;}
//        else { throw new Exception("unknown structure of the XML"); }

    };
    abstract public void SetNode(String key, String value);
};


от него унаследовал:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
class TUsers extends TTable
{
    enum Fields
    {
        code {вот здесь значение string},
        username,
        firstname,
        lastname,
        age {вот здесь значение int},
        bitrh {вот здесь значение date};
    }
    public String code;
    public String username;
    public String firstname;
    public String lastname;
    public int age;
    public Date bitrh;

    @Override
    public void SetNode(String key, String value) {
        //To change body of implemented methods use File | Settings | File Templates.
    }
}


Поля разных типов! Возможно меня совсем не туда понесло только начал изучать java. Хочется использовать полиморфизм для того чтобы поле работать с TTable, а нужные поля описывать в дочерних классах. Надеюсь не очень путано написал.
...
Рейтинг: 0 / 0
Создание enum
    #37913043
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) getInstance(String key) можно реализовать в 1 строчку через рефлекию.

2) enum тебе вообще не нужен. В Java класслодеру достаточно информации о классе в самом классе.
Ниакие дополнительные мета-записи не нужны.
...
Рейтинг: 0 / 0
Создание enum
    #37913517
ErikI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

Можно чуток по подробнее. В java я пока сильно плаваю и не понял к чему применить getInstance.
...
Рейтинг: 0 / 0
Создание enum
    #37913541
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так.

Код: java
1.
2.
3.
4.
5.
    public static TTable getInstance(String key) 
    {        
        Class c = Class.forName(key);        
        return (TTable)c.newInstance();
    };



Исключения сам обработай на своё усмотрение.
...
Рейтинг: 0 / 0
Создание enum
    #37913798
ErikI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

Как я понимаю скорость будет приемлемой при использовании рефлексии getInstance. Только надо обзывать классы в соответствии с key(это root XML).

Но вопрос то заключался в том, что мне нужно что то вроде двухмерного массива или массив классов, который определен в родителе. Значение поля должен быть вариант, а определяются
название полей и их значения в дочерних классах. Я делаю парсинг XML файлов и хочу написать его красиво. Что бы для нового XML файла надо было только сделать нового наследника и назвать его в соответствии рутовым полем XML.
...
Рейтинг: 0 / 0
Создание enum
    #37913832
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErikI,

Вам нужно воссоздать объект из XML? Воспользуйтесь сериализацией
...
Рейтинг: 0 / 0
Создание enum
    #37913862
ErikI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

Нет мне надо пропарсить XML поместить значения в классы передать по сети(здесь будет сериализация) и на той стороне записать в базу данных. Для этого я сделал сканер директории сформировал список и проходя по этому списку вызываю парсер XML. В начале я определил кучу полей из структуры XML файла. Поле решил, что будет удобнее использовать одну структуру для хранения и записи в базу данных для различных таблиц. Вот и пытаюсь найти удобное решение.
...
Рейтинг: 0 / 0
Создание enum
    #37914038
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanErikI,
Вам нужно воссоздать объект из XML? Воспользуйтесь сериализацией
+1
что-то смахивает на велосипед IMHO. Т.к. в Delphi этого не было, и надо было всё руками делать.
...
Рейтинг: 0 / 0
Создание enum
    #37914114
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123UsmanErikI,
Вам нужно воссоздать объект из XML? Воспользуйтесь сериализацией
+1
что-то смахивает на велосипед IMHO. Т.к. в Delphi этого не было, и надо было всё руками делать.
Сериализация в XML была в D7 точно, а вроде и в D5 или D6 появилась.
...
Рейтинг: 0 / 0
Создание enum
    #37914135
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErikIUsman,

Нет мне надо пропарсить XML поместить значения в классы передать по сети(здесь будет сериализация) и на той стороне записать в базу данных. Для этого я сделал сканер директории сформировал список и проходя по этому списку вызываю парсер XML. В начале я определил кучу полей из структуры XML файла. Поле решил, что будет удобнее использовать одну структуру для хранения и записи в базу данных для различных таблиц. Вот и пытаюсь найти удобное решение.
Если таблиц с 10 или меньше, удобней сделать один Java-класс на таблицу и разметить его аннотациями hibernate и digester (или JAXB). Если классов больше, то надо брать рефлексию и тогда настройки можно вообще вынести в отдельный файл, туда же прикрутить обработку сложных случаев (например, поле FIO из XML кладется в FirstName, MiddleName, LastName в таблицу) и придется работать с SQL напрямую.
...
Рейтинг: 0 / 0
Создание enum
    #37914197
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeonidvСериализация в XML была в D7
я говорю не про теорию, а про практику.
Она никому не нужна в разработке ПО.
...
Рейтинг: 0 / 0
Создание enum
    #37914227
ErikI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извините, но вы меня не так поняли. В XML не содержится никаких классов, это голые данные. Этот проект я делаю для собственного обучения. Что разобраться и в дальнейшем применять такие конструкции.
...
Рейтинг: 0 / 0
Создание enum
    #37914267
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123LeonidvСериализация в XML была в D7
я говорю не про теорию, а про практику.
Она никому не нужна в разработке ПО.
Я уже заметил это твое отношение к жизни ))) Не практика,

В D7 можно было на основе XML сгенерировать все нужные классы-обертки для сериализации/десерелизации в XML. Работать было достаточно удобно.

Если ты чего-то не знаешь, не значит, что этого не было. Довольно очевидный факт, не находишь?
...
Рейтинг: 0 / 0
Создание enum
    #37914269
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErikIИзвините, но вы меня не так поняли. В XML не содержится никаких классов, это голые данные. Этот проект я делаю для собственного обучения. Что разобраться и в дальнейшем применять такие конструкции.
В XML никогда классы не содержаться. Но данные из XML можно отобразить в классы. Либо делать через рефлексию, как я написал выше.

Приведите пример входных данных и таблицу.
...
Рейтинг: 0 / 0
Создание enum
    #37914317
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeonidvErikIИзвините, но вы меня не так поняли. В XML не содержится никаких классов, это голые данные. Этот проект я делаю для собственного обучения. Что разобраться и в дальнейшем применять такие конструкции.
В XML никогда классы не содержаться. Но данные из XML можно отобразить в классы. Либо делать через рефлексию, как я написал выше.

Приведите пример входных данных и таблицу.

Наверное при парсинге использовать рефлексию - не лучший выход.

Автор, самый просто способ
1) генерите по xml файлу xsd схему(тулзы, допустим, Trang)
2) с помощью этой xsd генерите java классы с помощью встроенной в jdk утилиты jkd/bin/xjc.exe
3) Вставляете себе в проект эти классы(не забываем в ObjectFactory прописать правильный пакет или при генерации xjc его указать)
4) Делаем анмаршал и работает с xml как с обычной сущностью через get методы

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
private static Object unmarshal(File xmlFile, String xsd) throws JAXBException, SAXException {
        JaxbSerializatorImpl jaxbContext = new JaxbSerializatorImpl("ваш package где хранятся сгенерированные сущности");
        Unmarshaller unmarshaller = jaxbContext.getUnmarshaller();
        SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        URL xsdUrl = ClassLoader.getSystemClassLoader().getResource(xsd);
        if (xsdUrl != null) {
            Schema schema = sf.newSchema(xsdUrl);
            unmarshaller.setSchema(schema);
        } else {
            throw new SAXException("Cannot find XSD url");
        }

        unmarshaller.setEventHandler(new FtpValidationHandler());
        return unmarshaller.unmarshal(xmlFile);
    }
...
Рейтинг: 0 / 0
Создание enum
    #37914319
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин,

нда...там в коде еще работа с ресурсами, у меня xsd валяется в ресурсах, если что.
...
Рейтинг: 0 / 0
Создание enum
    #37914325
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
private static Object unmarshal(File xmlFile, String xsd) throws JAXBException, SAXException {
        JaxbSerializatorImpl jaxbContext = new JaxbSerializatorImpl("ваш package где хранятся сгенерированные сущности");
        Unmarshaller unmarshaller = jaxbContext.getUnmarshaller();
        SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        URL xsdUrl = ClassLoader.getSystemClassLoader().getResource(xsd);
        if (xsdUrl != null) {
            Schema schema = sf.newSchema(xsdUrl);
            unmarshaller.setSchema(schema);
        } else {
            throw new SAXException("Cannot find XSD url");
        }

        return unmarshaller.unmarshal(xmlFile);
    }



Немного из кода убрал лишнего 4)Убрал валидтор для схемы, пока что он не нужен будет
...
Рейтинг: 0 / 0
Создание enum
    #37914327
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeonidvРаботать было достаточно удобно.
ты в Delphi работал? Или в Java?
Я тебе уже про Delphi рассказывал (ниже)
Больше не собираюсь. Разговаривай с аффтаром а не со мной
______________________________________________
"Не понял" от Лёни 11906276 и чем всё закончилось 11910058
...
Рейтинг: 0 / 0
Создание enum
    #37914373
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123LeonidvРаботать было достаточно удобно.
ты в Delphi работал? Или в Java?

Работал в Delphi. Работаю в Java. Еще вопросы для моего досье?
...
Рейтинг: 0 / 0
Создание enum
    #37914784
ErikI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Озверин,

Благодарю вас за пример, обязательно попробую сделать таким способом как только закончу предыдущий. Сейчас делаю парсинг основанный на DOM модели. Вот мой парсер:
public class XMLParser
{
public ArrayList<HashMap<Integer, TFields>> start(List<String> FileList)
{
ArrayList<HashMap<Integer, TFields>> ListTable = new ArrayList<HashMap<Integer, TFields>>();
for (String Name : FileList)
{
try
{
Document doc = parserXML(new File(Name));
doc.getDocumentElement().normalize();
NodeList nodeList = doc.getElementsByTagName(doc.getDocumentElement().getChildNodes().item(1).getNodeName());

String Root = doc.getDocumentElement().getNodeName();

TFields Fields = TFields.getInstance(Root);
HashMap<Integer, TFields> Table = new HashMap<Integer, TFields>();

for(int i = 0; i < nodeList.getLength(); i++)
{
Node node = nodeList.item(i);
if(node.getNodeType() == Node.ELEMENT_NODE)
{
Element element = (Element)node;
Fields.Id = Node.ATTRIBUTE_NODE;
Fields.SetNode(node.getNodeName(), node.getNodeValue());
}
}
Table.put(Fields.Id, Fields);
ListTable.add(Table);
}
catch(Exception error)
{
error.printStackTrace();
}

}
return ListTable;
}
public Document parserXML(File file) throws SAXException, IOException, ParserConfigurationException
{
return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
}
}

Вызываю я его так:

public static void main(String args[]) throws InterruptedException, IOException, NoSuchAlgorithmException
{
List<String> FileList;
FileParser fp = new FileParser() ;
FileList = fp.parse("c:\\Public\\1" , 4 , "([a-zA-Z]:)?(\\\\[a-zA-Z0-9\\\\.]+).xml") ;
XMLParser XML_Parser = new XMLParser();
ArrayList<HashMap<Integer, TFields>> ListTable = XML_Parser.start(FileList);

for (HashMap<Integer, TFields> iterListTable: ListTable)
{
// for (Iterator iterFields = iterListTable.iterator(); .hasNext();)
for (int i = 0; i >iterListTable.size(); i++) //вот тут мне надо пройти по HashMap Table, вроде это можно сделать через итератор?
{
....................
}
};
...
Рейтинг: 0 / 0
Создание enum
    #37915085
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErikI,

Без кода нечитаемо. Но в целом. если просто поизучать, то тогда еще посмотрите StAX - для вашей задачи он больше подходит. А чтобы окончательно тему добить разберитесь с JaXB (пример с ним вам Озверин привел).
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Создание enum
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]