2017-12-12 6 views
0

Ich habe die folgenden Methoden auf meinem Code:für wiederholte Aktionen

fun saveArticles(data: JSONArray) { 
    var active = String() 
    for (i in 0..data.length().minus(1)) // create string 

    val articles = Select.from(Article::class.java).list() 

    val iterator = articles.iterator() 
    while (iterator.hasNext()) { 
     val article = iterator.next() as Article 
     if (!active.contains(Regex(article.id.toString()))) article.delete() 
    } 
} 

fun saveDossiers(data: JSONArray) { 
    var active = String() 
    for (i in 0..data.length().minus(1)) // create string 

    val dossiers = Select.from(Dossier::class.java).list() 

    val iterator = dossiers.iterator() 
    while (iterator.hasNext()) { 
     val dossier = iterator.next() as Dossier 
     if (!active.contains(Regex(dossier.id.toString()))) dossier.delete() 
    } 
} 

fun saveVideos(data: JSONArray) { 
    var active = String() 
    for (i in 0..data.length().minus(1)) // create string 

    val videos = Select.from(Video::class.java).list() 

    val iterator = videos.iterator() 
    while (iterator.hasNext()) { 
     val video = iterator.next() as Video 
     if (!active.contains(Regex(video.id.toString()))) video.delete() 
    } 
} 

Wie Sie sehen können, alle Methoden zu tun genau das Gleiche. Der einzige Unterschied ist der Klassentyp des Objekts, an dem ich gerade arbeite. Kann ich irgendwie eine einzelne Methode mit einem Parameter vom Typ Klasse erstellen, und abhängig vom Typ die Klasse ändern, die ich arbeiten muss? Etwas wie folgt aus:

fun saveVideos(data: JSONArray, type: Class) { 
    var active = String() 
    for (i in 0..data.length().minus(1)) // create string 

    val list = Select.from(type).list() 

    val iterator = list.iterator() 
    while (iterator.hasNext()) { 
     val item = iterator.next() as type 
     if (!active.contains(Regex((item as type).id.toString()))) item.delete() 
    } 
} 
+0

Extrakt 'delete' an eine Schnittstelle und lassen Sie alle Ihre Klasse, die eine Schnittstelle implementieren und – WenChao

+0

ich nicht in dieser Schnittstelle als zweiten Parameter Ihrer Methode übergeben bin ganz sicher, was meinst du mit "pass in dieser Schnittstelle als zweiter Parameter". Ich arbeite selten mit Interfaces, daher bin ich mir nicht sicher, wie sie funktionieren. Können Sie ein Beispiel geben? – Ravers

+2

Sie können einer Methode auch einen Typ hinzufügen. Etwas wie folgt aus: 'Inline-Spaß speichern (data: JSONArray) { val list = Select.from (T :: class.java) .list() }' Und dann nennen Sie es wie 'speichern

Antwort

1

Sie benötigen eine Schnittstelle zu extrahieren und einen reified generic zu verwenden.

interface Blabla { 
    fun delete() 
    val id: Int 
} 

inline fun <reified T : Blabla>saveVideos(data: JSONArray) { 
    var active = String() 
    for (i in 0..data.length().minus(1)) // create string 

    val list = Select.from(T::class.java).list() 

    val iterator = list.iterator() 
    while (iterator.hasNext()) { 
     val item = iterator.next() as T 
     if (Regex(item.id.toString()) !in active) item.delete() 
    } 
} 

Dies sollte funktionieren.

Auch ich empfehle Ihnen, die Kotlin Sammlung Bibliothek, wie diese zu verwenden.

inline fun <reified T : Blabla>saveVideos(data: JSONArray) { 
    val active = "" 
    for (i in 0 until data.length()) {} // create string 

    val list = Select.from(T::class.java).list() 

    list 
      .map { it as T } 
      .filter { Regex(it.id.toString()) !in active } 
      .forEach { it.delete() } 
} 

Und Sie können sogar ersetzen forEach { it.delete() } mit forEach(T::delete)

Verwandte Themen