Есть ли способ уменьшить количество кода? - PullRequest
1 голос
/ 06 марта 2020

Я делал проект на учебе, он выглядит хорошо, но я хочу сделать его как можно лучше. У меня есть два отдельных JSON файла, содержащих пользователей и действия. Мне нужно извлечь эти данные и поработать с ними. Но вопрос в том, чтобы получить эти данные. У меня есть класс с именем DataReader, который имеет два метода - readUsers и readActions.

public class DataReader {
    Gson gson = new GsonBuilder().setDateFormat("MM.dd").create();

    public ArrayList<Action> readActions(String fileName)
            throws JsonIOException, JsonSyntaxException, FileNotFoundException {
        Type actionsArrayList = new TypeToken<ArrayList<Action>>() {
        }.getType();
        return gson.fromJson(new FileReader(fileName), actionsArrayList);
    }

    public HashMap<Integer, User> readUsers(String fileName)
            throws JsonIOException, JsonSyntaxException, FileNotFoundException {
        Type usersHashMap = new TypeToken<HashMap<Integer, User>>() {
        }.getType();
        return gson.fromJson(new FileReader(fileName), usersHashMap);
    }
}

Как вы можете видеть, эти два метода делают одно и то же, различие заключается только в типе возвращаемого объекта и получает из этого JSON файла.

Так есть ли какие-либо возможности создать метод, подобный readData, который бы получал только параметр fileName и сам разбирался, чтобы уменьшить объем кода?

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Может быть, вы можете попробовать это.


public<T> T readData(String fileName,TypeToken<T> typeRef)
            throws JsonIOException, JsonSyntaxException, FileNotFoundException {

   return gson.fromJson(new FileReader(fileName), typeRef);
}


// make a type class , e.g: MyGsonTypes
public final class MyGsonTypes{

   public static final TypeToken<HashMap<Integer, User>> usersHashMapType = new TypeToken<HashMap<Integer, User>>(){}.getType();

}


// when you use it
var data = readData("1.json", MyGsonTypes.usersHashMapType);

1 голос
/ 06 марта 2020

Вам необходимо закрыть этот Reader, в частности объект FileReader, который вы создаете. Вам также не нужно определять Type как локальную переменную, так как это не нужно. Просто вставьте это. Вы можете сделать то же самое для другого метода.

        public List<Action> readActionsSimplified(String fileName) throws IOException {
            try (Reader reader = new FileReader(fileName)) {
                return gson.fromJson(reader, new TypeToken<List<Action>>() {}.getType());
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...