Как создать экземпляр Java объекта из класса данных Kotlin, но не включать все поля?

У меня есть следующий класс данных Kotlin:

data class Filter @JvmOverloads constructor(
        val key: String? = null,
        val operation: String? = null,
        val value: String? = null,
        val group: String? = null,
        val searchInTranslations: Boolean? = null)

Я создаю экземпляр этого класса в коде Java. Но я хочу создать экземпляр со всеми полями, кроме поля group. Как я могу сделать это на Java?

Я не могу присвоить значение по умолчанию group, потому что в некоторых классах Java я присваиваю значение этому полю, в других классах Java мне нужно исключить это поле из создания объекта.


person Vitalii Plagov    schedule 10.01.2019    source источник


Ответы (1)


Java не поддерживает это, но вы можете сделать простой трюк.

Создайте два конструктора, один с необязательным полем group, другой без него. Таким образом, из классов вам не нужно присваивать значение этому полю, просто вызовите второй конструктор:

public YourClass(String key, String operation, String value, bool search) 
{
  this (key, operation, value, null, search); //null for the groups
}
person aran    schedule 10.01.2019
comment
Спасибо! Это будет работать, если поле group является единственным полем, которое может быть необходимо или нет. В случае, если в следующий раз мне не нужно будет включать поле value - мне нужно будет создать еще один конструктор. Я думал, может быть, есть общее решение для этого подхода. - person Vitalii Plagov; 10.01.2019
comment
О, я понял твою мысль. Я думаю, вы могли бы сделать это, используя какой-то фабричный механизм, который выбирает правильный конструктор. В любом случае, вы думали о том, чтобы не создавать конструктор (таким образом, оставив только один по умолчанию), а просто инициализировать поля с помощью сеттеров? - person aran; 10.01.2019
comment
Да, я думал задавать значения с помощью сеттеров, но мне понравилась реализация класса данных в Котлине, поэтому я начал использовать его таким образом. Вы предлагаете использовать обычный класс (не класс данных) и определять сеттеры и геттеры? - person Vitalii Plagov; 10.01.2019
comment
Если у вас на самом деле нет фиксированной структуры (например, типы A никогда не получают группы, а типы B никогда не получают операции), вы можете легко создать фабрику конструкторов с другим (фиксированным) числом конструкторов. Но если вы на самом деле не знаете точные типы входящих данных, я считаю, что подход сеттера подойдет лучше. Впрочем, это чисто философский вопрос :) - person aran; 10.01.2019