java config объектов

184
19 декабря 2018, 00:00

У меня есть класс простого объекта, например man, с двумя полями name и age. И мне нужно, чтоб при старте программы, считывался текстовый конфигурационный файл, в котором будут описаны экземпляры класса. Например

[vova]
age=12
[max]
age=10

и т.д. ну и дальше, я бы создал соответствующие экземпляры с этими параметрами.

Понятно, что я могу написать кастомный парсер файла...но может уже есть готовый инструмент типа properties ?

формат файла с настройками не принципиален, я привел пример на вскидку...

Answer 1

Судя по всему вы хотите сериализовывать и десериализовывать Java Beans. Есть стандартная реализация этого через XML файлы.

Предположим, что ваш Java Bean представляет из себя следующий класс:

package com.example;
public class Human {
    private String name;
    private int age;
    public Human() {
        // needs for serialization
    }
    public Human(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Human{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

Переопределение toString() тут необязательно. Я его сделал лишь для того, чтобы иметь возможность распечатывать объекты в демонстрационном коде. А вот и сам демонстрационный код, показывающий процесс сериализации и десериализации экземпляров класса Human:

public static void main(String[] args) {
    Human bob = new Human("Bob", 34);
    Human mary = new Human("Mary", 27);
    try (XMLEncoder encoder = new XMLEncoder(new FileOutputStream("humans.xml"))) {
        encoder.writeObject(bob);
        encoder.writeObject(mary);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    try (XMLDecoder decoder = new XMLDecoder(new FileInputStream("humans.xml"))) {
        Human human1 = (Human) decoder.readObject();
        Human human2 = (Human) decoder.readObject();
        System.out.println(human1);
        System.out.println(human2);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

Программа распечатает:

Human{name='Bob', age=34}
Human{name='Mary', age=27}

Тоесть в переменных human1 и human2 будут находиться объекты, эквивалентные тем, что находятся в переменных bob и mary соответственно.

Для рабочего кода желательно так же переопределить equals() и hashCode() в классе Human.

Содержимое файла humans.xml, в моём случае, получилось таким:

<?xml version="1.0" encoding="UTF-8"?>
<java version="10.0.2" class="java.beans.XMLDecoder">
 <object class="com.example.Human">
  <void property="age">
   <int>34</int>
  </void>
  <void property="name">
   <string>Bob</string>
  </void>
 </object>
 <object class="com.example.Human">
  <void property="age">
   <int>27</int>
  </void>
  <void property="name">
   <string>Mary</string>
  </void>
 </object>
</java>
READ ALSO
Error: Could not find or load main class intellij Idea

Error: Could not find or load main class intellij Idea

Программа выдает такую ошибку при запускеПрописал в командоре класспас

188
логика приложения используя JavaFX

логика приложения используя JavaFX

Объясните логику написания приложения используя JavaFXСуть у меня такая: есть три FXML файла mainWindows, Windows2 - которое открывается используя Button2,...

188
Есть ли аналог setDefaultCloseOperation()?

Есть ли аналог setDefaultCloseOperation()?

Мне нужно сделать:

164
Hibernate SessionFactory всегда NULL

Hibernate SessionFactory всегда NULL

Всем привет! У меня очень странная проблема, буквально час назад у меня все собиралось, но сейчас пересталоХотя я ничего не менял :(

171