Kotlin – Расширение для финального класса

Можно ли создать расширение final классов, таких как String? Как и в быстрой, можно добавить дополнительные методы в extension final class .

Например, я хотел бы создать метод в расширении String который скажет мне, что String имеет допустимую длину для пароля.

  val password : String = mEdtPassword!!.getText().toString() // how to define haveValidLength method in extension val isValid : Boolean = password.haveValidLength() 

Примечание. Этот пример предназначен только для понимания удобства использования, а не для реального сценария.

Да, ты можешь. Метод расширения Kotin обеспечивает возможность расширения класса с новыми функциональными возможностями без наследования с класса или использования любого типа шаблона проектирования, такого как Decorator.

Ниже приведен метод расширения для String :

 // v--- the extension method receiver type fun String.at(value: Int) = this[value] 

И код метода расширения, созданный как Java ниже:

 public static char at(String receiver, int value){ return receiver.charAt(value); } 

Поэтому метод расширения в Котлине использует делегирование, а не наследование.

Затем вы можете вызвать метод расширения, например, как его функцию-член, как показано ниже:

 println("bar".at(1))//println 'a' 

Вы также можете написать метод расширения для существующей функции расширения, например:

 fun String.substring(value: Int): String = TODO() // v--- throws exception rather than return "ar" "bar".substring(1) 

Но вы не можете написать метод расширения для существующей функции-члена, например:

 operator fun String.get(value: Int): Char = TODO() // v--- return 'a' rather than throws an Exception val second = "bar"[1] 

Пытаясь добавить более подробную информацию, этот ответ может быть полезен для кого-то.

Да, мы можем добавить дополнительные методы для final классов, таких как String . Например, я хотел бы добавить один метод в String который скажет мне, что моя String имеет действительное количество символов для пароля или нет.

Поэтому мне нужно сделать следующее: я создаю функцию ниже, которая может быть написана в том же class или в отдельном отдельном файле class .

  fun String.hasValidPassword() : Boolean { // Even no need to send string from outside, use 'this' for reference of a String return !TextUtils.isEmpty(this) && this.length > 6 } 

И теперь из любого места звоните

  val isValid : Boolean = password.haveValidLength() 

Предложение

Если ваше приложение имеет только одно удостоверение пароля, то проблем нет.

Тем не менее, я не предлагаю вам написать такой метод расширения hasValidPassword если приложение имеет более одной проверки. так как метод расширения является насыщенным , вы не можете изменить свой hasValidPassword во время выполнения. Поэтому, если вы хотите изменить проверку во время выполнения, вы должны использовать функцию, например:

 class PasswordRepository(private val validate:(String)->Boolean){ fun save(value:String){ if(validate(value)){ //TODO persist the password } } } val permitAll = PasswordRepository {true} val denyAll = PasswordRepository {false} permitAll.save("it will be persisted") denyAll.save("it will not be persisted") 

Другими словами, метод расширения выше нарушает принцип единой ответственности , он выполняет операции проверки и строки.

Вы можете сделать это с помощью функций расширения в Котлине. С расширениями вы можете добавлять дополнительные функции к классу, к которому у вас есть или нет доступа; например, базовую базу кода. В примере, приведенном в документах Kotlin здесь , swap был добавлен в MutableList<Int> который не имеет swap изначально. Используется this ключевое слово, которое относится к объекту, на котором будет работать функция свопинга. В приведенном ниже примере this относится к testList

 val testList = mutableListOf(1, 2, 3) testList.swap(0, 2) 
Intereting Posts
HttpException не пойман onError () Текст ярлыка не обновляется, хотя поток пользовательского интерфейса кажется отзывчивым Воспоминание функции-члена класса данных Kotlin Связывание представления с изменяющимся свойством контроллера Что сделает HashMap (it)? Определите глобальную функцию в Kotlin, которую я буду использовать в html-файле для использования в качестве обратного вызова onclick Kotlin Получить оценку JSON Тип несоответствия: выведенный тип – FragmentActivity? но при обновлении библиотеки поддержки до 27.0.0 Как использовать с оберткамиDefault? Может ли кто-нибудь здесь подробно описать структуру проекта приложения «Котлин / Родник»? Кроме того, особенности работы различных модулей Правильный способ получить свойства с конфигурацией Kotlin-script для Gradle Дифференцировать неоднозначные расширения в Котлине Kotlin Generics и nullable Тип класса Удалить слушателя Firebase не работает Подкласс AsyncTask в Kotlin – не может использовать параметр первичного конструктора в onPostExecute