Kotlin — «выполнить» для статических методов Java

#kotlin #extension-methods #static-methods

#kotlin #расширение-методы #статические методы

Вопрос:

У меня есть следующий код:

 import javax.swing.*
...
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName())
UIManager.put("ToolTip.border", BorderFactory.createEmptyBorder())
UIManager.put("PopupMenu.border", BorderFactory.createEmptyBorder())
...
  

Я хочу избавиться от всех UIManager. определителей, вот так:

 UIManager.run {
    setLookAndFeel(getCrossPlatformLookAndFeelClassName())
    put("ToolTip.border", BorderFactory.createEmptyBorder())
    put("PopupMenu.border", BorderFactory.createEmptyBorder())
    ...
}
  

Конечно, этот код не компилируется. Возможно ли этого достичь?

Комментарии:

1. import javax.swing.UIManager.*

2. Я не хочу загрязнять пространство имен другими методами.

3. Я не вижу других вариантов без создания оболочек. Если вам не нравится общее название put , вы можете создать служебный метод с другим именем и вызвать этот метод. Или создайте, object который переносит каждый вызов в UIManager, а затем вызывает run этот объект.

Ответ №1:

для достижения этого вы можете использовать ключевое слово ‘with‘. Это одна из функций определения области видимости в Kotlin.

 with(UIManager)
{
    setLookAndFeel(getCrossPlatformLookAndFeelClassName())
    put("ToolTip.border", BorderFactory.createEmptyBorder())
    put("PopupMenu.border", BorderFactory.createEmptyBorder())
    ...
}
  

В конечном итоге вы ожидаете какую-то функцию определения области видимости.В этой статье дается подробное объяснение usecase для каждой функции области видимости в Kotlin. https://medium.com/@elye.project/mastering-kotlin-standard-functions-run-with-let-also-and-apply-9cd334b0ef84

Комментарии:

1. форматирование вашего кода не соответствует соглашениям Java / Kotlin kotlinlang.org/docs/reference /…

2. @Eugene Я не совсем понимаю, на что вы ссылаетесь.

3. For curly braces, put the opening brace in the end of the line where the construct begins, and the closing brace on a separate line aligned horizontally with the opening construct.

4. Classifier 'UIManager' does not have a companion object, and thus must be initialized here .

5. @dyukha Да, это проблема. Не пробовал это с java static. Изучаю это. Обновлю, если смогу обойти это.