Mam klasę 10+ w klasie danych, chcę zainicjować klasę danych za pomocą pustego konstruktora i ustawić wartości tylko dla kilku parametrów za pomocą settera i przekazać obiekt do serwera.
data class Activity(
var updated_on: String,
var tags: List<String>,
var description: String,
var user_id: List<Int>,
var status_id: Int,
var title: String,
var created_at: String,
var data: HashMap<*, *>,
var id: Int,
var counts: LinkedTreeMap<*, *>,
)
Stosowanie:
Coś takiego będzie łatwe
val activity = Activity();
activity.title = "New Computer"
sendToServer(activity)
Ale wymaga to przekazania wszystkich argumentów podczas tworzenia konstruktora. Jak mogę uprościć jak wyżej?
val activity = Activity(null,null,null,null,null,"New Computer",null,null,null,null);
sendToServer(activity)
copy
potrzebujesz instancji klasy danych. Aby go utworzyć, musisz wywołać konstruktor - i tu był problem.emptyList
nie będzie wielokrotnie przydzielać pamięci. Zwraca singleton .Jeśli podasz wartości domyślne dla wszystkich pól - pusty konstruktor jest generowany automatycznie przez Kotlin.
i możesz po prostu zadzwonić:
źródło
class FeelComChatMessage (messageText: String = "", messageUser: String = "")
Wraz z odpowiedzią @miensol pozwól mi dodać kilka szczegółów:
Jeśli chcesz widoczny konstruktor w Javie za pomocą klas danych, musisz go jawnie zdefiniować.
Używanie wartości domyślnych + specyfikatora konstruktora jest dość łatwe:
Oznacza to, że dzięki tej sztuczce możesz teraz serializować / deserializować ten obiekt za pomocą standardowych serializatorów Java (Jackson, Gson itp.).
źródło
Jeśli podasz wartość domyślną dla każdego parametru podstawowego konstruktora:
oraz z klasy, w której instancje można wywołać bez argumentów lub z argumentami, które masz w danym momencie
źródło
Proponuję zmodyfikować główny konstruktor i dodać wartość domyślną do każdego parametru:
Możesz także ustawić wartości zerowalne, dodając,
?
a następnie zakładającnull
:Ogólnie rzecz biorąc, dobrą praktyką jest unikanie obiektów zerowalnych - pisz kod w taki sposób, abyśmy nie musieli ich używać. Niedopuszczalne obiekty są jedną z zalet Kotlina w porównaniu z Javą. Dlatego preferowana jest pierwsza z powyższych opcji .
Obie opcje dają pożądany rezultat:
źródło
Niepusty pusty konstruktor klasy danych w Kotlin:
Pusty konstruktor wtórny dla klasy danych w Kotlin:
źródło
Z dokumentacji
źródło