2016-11-29 3 views
11

У меня есть класс с lateinit полями, так что они не присутствуют в конструкторе: методКотлин - генерировать ToString() для класса без данных

class ConfirmRequest() { 
    lateinit var playerId: String 
} 

Я хотел бы иметь ToString() со всеми и не хотите писать вручную, чтобы избежать печати котла. Если бы я использовал Java, я бы использовал Lombok @ToString аннотацию к этой проблеме. Есть ли способ реализовать его в Котлине?

+1

Ломбок все еще может работать, нет? – voddan

+0

Аннотации Lombok не работают, объяснение: http://stackoverflow.com/questions/35517325/kotlin-doesnt-see-java-lombok-accessors – awfun

+1

Я рекомендую оспаривать необходимость «lateinint var» и «data», 'toString()' в том же классе. Не понимая больше о том, как используется «ConfirmRequest», сложно сделать рекомендацию, но «класс данных ConfirmRequest (var playerId: String? = Null)», кажется, отлично работает для меня. Если бы вы знали, что он никогда не будет использоваться в то время, когда 'playerId == null', вы можете сделать элемент данных частным и открыть для него публичное свойство, отличное от null. – mfulton26

ответ

4

Рекомендуемый способ - написать toString вручную (или сгенерировать IDE) и надеяться, что у вас не так много таких классов.

Целью data class является размещение наиболее распространенных случаев 85%, что оставляет 15% для других решений.

+0

Хорошо, нужно будет сгенерировать его с помощью IDE – awfun

+2

Наконец-то решил использовать 'jackson-module-kotlin', что позволяет использовать конструкторы аргументов, поэтому классы данных теперь соответствуют моим потребностям: ' data class ConfirmRequest (var playerId: String) ' – awfun

3

Как и вы, я использовал для использования lombok для toString() и equals() в Java, поэтому было немного разочаровано тем, что для не-данных классов в Котлине требуется весь стандартный шаблон.

Итак, я создал Kassava, библиотеку с открытым исходным кодом, которая позволяет реализовать toString() и equals() без каких-либо шаблонов - просто поставьте список свойств, и все готово!

Например:

// 1. Import extension functions 
import au.com.console.kassava.kotlinEquals 
import au.com.console.kassava.kotlinToString 

import java.util.Objects 

class Employee(val name: String, val age: Int? = null) { 

    // 2. Optionally define your properties for equals()/toString() in a companion 
    // object (Kotlin will generate less KProperty classes, and you won't have 
    // array creation for every method call) 
    companion object { 
     private val properties = arrayOf(Employee::name, Employee::age) 
    } 

    // 3. Implement equals() by supplying the list of properties to be included 
    override fun equals(other: Any?) = kotlinEquals(
     other = other, 
     properties = properties 
    ) 

    // 4. Implement toString() by supplying the list of properties to be included 
    override fun toString() = kotlinToString(properties = properties) 

    // 5. Implement hashCode() because you're awesome and know what you're doing ;) 
    override fun hashCode() = Objects.hash(name, age) 
} 
+0

отличный совет по этому ломбоку для java, хотелось бы знать раньше :( – ycomp

1

Я считаю, Apache Commons Ланг ToStringBuilder с отражением полезным, но он вызывает hashCode() и другие методы, когда мне не нужно, что (и один называется hashCode() из третьих сторон Lib генерирует NPE).

Так что я просто пойти с:

// class myClass 
    override fun toString() = MiscUtils.reflectionToString(this) 

// class MiscUTils 
fun reflectionToString(obj: Any): String { 
    val s = LinkedList<String>() 
    var clazz: Class<in Any>? = obj.javaClass 
    while (clazz != null) { 
     for (prop in clazz.declaredFields.filterNot { Modifier.isStatic(it.modifiers) }) { 
      prop.isAccessible = true 
      s += "${prop.name}=" + prop.get(obj)?.toString()?.trim() 
     } 
     clazz = clazz.superclass 
    } 
    return "${obj.javaClass.simpleName}=[${s.joinToString(", ")}]" 
} 
1

Вы можете определить класс данных, содержащий данные, которые вы хотите использовать и реализовать методы, делегируя к этому.

https://stackoverflow.com/a/46247234/97777

Смежные вопросы