1

私はFPに従うことに問題があります。人々が「もっと慣用的なスタイル」と言うとき、私はそれを理解しなければなりません:Javaライブラリの99%は、KotlinとScalaのFP慣用スタイルには適用できません。さて、Vaadinを使って簡単に起動するにはSpring Bootが必要です。だから私はいくつかの豆を注入する必要があります。Kotlinのトップレベル関数にIoCを注入する方法は? IoCコンテナを使用していますか?

package com.x.ui 

import com.vaadin.icons.VaadinIcons 
import com.vaadin.navigator.Navigator 
import com.vaadin.ui.MenuBar 

fun createMenuBar(navigator: Navigator): MenuBar { 
    val menuBar = MenuBar() 
    menuBar.setHeight(null) 
    menuBar.setWidth(null) 

    menuBar.addItem("Dashboard", VaadinIcons.COG, 
      { navigator.navigateTo("Dashboard") } as MenuBar.Command) 

    return menuBar 
} 

この場合、SpringNavigatorをこの機能にどのように注入すればよいですか?

私は今までトップレベルの機能をいくつか持っていたので、@Beanも@Componentもありませんでした。なぜなら、Spring IoCでKotlinを使用するには何が慣用的なのでしょうか?私はクラスを使用することに限定されているのですか、それを行うためのトリックがありますか?

+2

トップレベルの機能は、Javaの静的メソッドに相当します:私はこのような何かをしようとすることをお勧め何

。私はそれが意味をなさないか、それに依存関係を注入する良い練習になるかはわかりません。 良い習慣とIMHOとして、これらの関数を依存関係注入で設定したクラスの中に置くことをお勧めします。 – Mario

答えて

0

問題は、あなたが署名(Navigator) -> MenuBarを持つ関数を持っていることですが、おそらくあなたが望むのは、署名が() -> MenuBarの関数です。

通常、OOでは、コンストラクタにNavigatorを挿入して参照を保存し、関数が呼び出されたときに使用します。

関数プログラミングでは、類似の概念は「部分関数アプリケーション」と呼ばれます。これは、関数にパラメータをあらかじめ適用し、残りのパラメータを取る新しい関数を作成するときです。私たちの場合、Navigatorを事前に適用して、() -> MenuBarの署名を残したいと考えています。

Thisは、Kotlinのコンセプトに関する良い記事のようです。

// note - returns `() -> MenuBar` now, rather than `MenuBar` 
fun createMenuBar(navigator: Navigator):() -> MenuBar { 
    // returning a function that takes no parameters 
    return { -> 
     val menuBar = MenuBar() 
     menuBar.setHeight(null) 
     menuBar.setWidth(null) 

     menuBar.addItem("Dashboard", VaadinIcons.COG, 
      { navigator.navigateTo("Dashboard") } as MenuBar.Command) 

     return menuBar 
    } 
} 
関連する問題