This is more than enough for the sample application. For more complex system, one could think about offering additional classes to hold more than one payload parameter e.g. PayloadMessage2<T, V> , PayloadMessage3<T, V, X> , etc. Instead, an OOP design could create actually create a concept around all parameters. For example, in order to create a Person , one would want to send the first name, the last name, and the birth date: instead of a PayloadMessage3<String, String, LocalDate> class, one could actually reuse the Person abstraction, or even better, create a dedicated PersonMessage(String, String, LocalDate) .