代码之家  ›  专栏  ›  技术社区  ›  Adrian Le Roy Devezin

如何将依赖类类型的类似代码减少到父类?

  •  0
  • Adrian Le Roy Devezin  · 技术社区  · 6 年前

    我正在使用jackson kotlin序列化和反序列化我的kotlin项目中的json对象。问题是,我必须在每个类中定义相同的方法,只更改一个typevalue。这似乎是非常糟糕的做法,所以我来到社区,就什么是最好的方式来处理这种情况。

    例子:

    class User: Model() {
        //...
        companion object {
    
            fun fromJson(json: String): User {
                return ObjectMapper().registerKotlinModule().readValue<User>(json)
            }
    
            fun toJson(user: User): String {
                return ObjectMapper().registerKotlinModule().writeValueAsString(user)
            }
    
    
        }
    }
    
    class Friend: Model() {
        //...
        companion object {
    
            fun fromJson(json: String): User {
                return ObjectMapper().registerKotlinModule().readValue<Friend>(json)
            }
    
            fun toJson(friend: Friend): String {
                return ObjectMapper().registerKotlinModule().writeValueAsString(user)
            }
    
    
        }
    }
    

    正如您所看到的,除了 readValue<>() 方法。有没有办法在model()类而不是从model继承的每个类中定义一个方法?

    2 回复  |  直到 6 年前
        1
  •  1
  •   urgentx Galeb Nassri    6 年前

    看来你可以雇佣 generics 在这里。

    伴随对象没有类的类型参数的概念,因为它们不是类的实例,所以您可以使函数实例方法被继承:

    class Model<T> {
        fun fromJson(json: String): User {
            return ObjectMapper().registerKotlinModule().readValue<T>(json)
        }
    
        fun toJson(friend: T): String {
            return ObjectMapper().registerKotlinModule().writeValueAsString(friend)
        }
    }
    

    或者让函数本身接受类型参数:

    class Model {
        companion object {
            fun <T> fromJson(json: String): User {
                return ObjectMapper().registerKotlinModule().readValue<T>(json)
            }
    
            fun <T> toJson(friend: T): String {
                return ObjectMapper().registerKotlinModule().writeValueAsString(friend)
            }
        }
    }
    
        2
  •  0
  •   Alexey Romanov    6 年前

    You don't want to create an ObjectMapper and register a module each time.

    class Model {
        companion object {
            // could be public if you want to do anything else with it
            private val objectMapper = ObjectMapper().registerKotlinModule()
    
            inline fun <reified T : Model> fromJson(json: String): User {
                return objectMapper.readValue<T>(json)
            }
    
            fun toJson(value: Model): String {
                return objectMapper.writeValueAsString(value)
            }
        }
    }
    

    使用:

    val friend = Model.fromJson<Friend>(...)
    

    或者只是 Model.fromJson(...) 当存在预期类型时。

    同样来自同一页:

    输入:byte[]如果有的话最好;inputstream次之;后面是reader——在任何情况下,都不要尝试将输入读入字符串!

    输出:outputstream是最好的;writer是第二好的;而调用writeValueAsString()是效率最低的(为什么要构造中间字符串?)