Это хорошая идея, чтобы поместить тип функции в качестве значений в HashMap? - PullRequest
0 голосов
/ 01 октября 2019

У меня есть вопрос о производительности помещения типа функции в качестве значений в HashMap .

Я видел, как код моего коллеги пишется так:

var mHandleMap = HashMap<String, (WebView,String) -> Unit >()

fun init() {
    mHandleMap.put(URL1, doSomething1)
    mHandleMap.put(URL2, doSomething2)
    mHandleMap.put(URL3, doSomething3)

    override fun onPageFinished(webView: WebView, url: String) {
        mHandleMap.forEach { (key, urlFunc) ->
            if (urlStr.contains(key)) {
                urlFunc(webView)
            }
        }
    }
    ...
}

private val doSomething1: (WebView) -> Unit = {
    ...
}

private val doSomething2: (WebView) -> Unit = {
    ...
}

private val doSomething3: (WebView) -> Unit = {
    ...
}


Если бы это был я, мой код может выглядеть следующим образом, этот вид кода будет для меня более интуитивно понятным:

val url = request!!.url.toString()
when {
    url.contains(URL1) -> doSomething1()
    url.contains(URL2) -> doSomething2()
    url.contains(URL3) -> doSomething3()
}

Его код выглядит действительно модно, но я волновалсяо, если есть какие-либо проблемы внутри.

Может ли кто-нибудь помочь мне указать, является ли это хорошим способом сделать это или нет?

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Ваш код не делает то, что делает его код, если в url содержится более одного из URL1 / URL2 / etc;Вы будете вызывать только функцию, соответствующую первому такому ключу, он вызовет функции для всех из них.

Кроме того, разница в производительности, вероятно, будет очень небольшой по сравнению с любым общением с внешним миром (например, если вы делаете запрос на любой из этих URL-адресов). Но даже незначительные различия могут сложиться, особенно для Android или других случаев с ограниченными ресурсами.

Плюс, если его поведение является намеченным, что-то вроде Array или List<Pair<...>> еще более эффективно использует памятьчем Map, если только где-то нет кода, ищущего по ключу.

1 голос
/ 01 октября 2019

Я бы использовал ваш способ, потому что он более лаконичен, этот способ hashmap никоим образом не улучшает код, кроме того, помните, что эти функциональные объекты, однажды скомпилированные в байт-код, будут такими: Objects, возможно, разница тривиальна с примеромВы предоставляете, но я бы предположил, что производительность пострадает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...