Класс с утилитой stati c метод дает непереходную непериализуемую ошибку поля экземпляра - PullRequest
0 голосов
/ 20 марта 2020

У меня есть служебный класс со статическим c только для метода

public final class ABC {

    /**
     * private constructor to prevent from object creation
     */
    private ABC() {
    }

    private static Map<String, String> buildInfo(@NonNull final X x) {

        final DataClass dataClass = x.getData();

        /**
          Some manipulation
        **/
        return info;
    }
}

У класса X есть класс данных с

class X {
    DataClass dataClass;
    ...
};

class DataClass {
    ...
    Optional<String> abc;
    ...
}


Этот фрагмент кода выдает «FindBugs сообщило о предупреждениях» , SE_BAD_FIELD: Non-transient non-Serialization instance field in serializable class для DataClass.

This Serializable class defines a non-primitive instance field which is neither transient, Serializable, or java.lang.Object, and does not appear to implement the Externalizable interface or the readObject() and writeObject() methods.  Objects of this class will not be deserialized correctly if a non-Serializable object is stored in this field.

Почему он выдает ошибки в служебном методе, где я не пытаюсь сделать сериализуемые вещи?

1 Ответ

0 голосов
/ 20 марта 2020

Это потому, что я возвращал

 Map<String, Integer> info = new HashMap<String, Integer>() {{
            put(Constants.ID_KEY, dataClass.getId());
            put(Constants.NAME_KEY, dataClass.getName());
        }};

, создавая анонимные классы.

Создание класса, который является подклассом HashMap, где HashMap является Serializable, а этот новый подкласс не Serializable.

В основном просто используйте Immutable Map Builder или HashMap с добавлением вручную в каждую строку вместо создания анонимный подкласс.

...