2017-05-24 11 views
-2

私は今かなりの時間でKotlinを使用していますが、Kotlinのすべてのプロパティでnot-null型を達成できませんでした。どうすればKotlinのヌルプロパティを避けることができますか

以下のコードをご覧ください。いくつかのシナリオでは、null型を使用する必要があります。私はlateinitを使用することができますが、いくつかのシナリオでは適合しません。私のコードでnullを避けるには?

誰かがヌルタイプなしでコードを書き直すことができたり、間違いを訂正したりすることができれば、すべてを理解するだけで十分です。

class MusicService : Service(), PlaybackManager.PlaybackServiceCallback { 

    private val mDelayedStopHandler = DelayedStopHandler(this) 
    private val eventBus = EventBus.getDefault() 

    //How to avoid nullable types 
    private var mMediaNotificationManager: MediaNotificationManager? = null 
    private var mSession: MediaSessionCompat? = null 
    var mSessionToken: MediaSessionCompat.Token? = null 
    var mPlaybackManager: PlaybackManager? = null 
    var mTransportControls: MediaControllerCompat.TransportControls? = null 

    override fun onCreate() { 
     Timber.d("onCreate") 
     super.onCreate() 

     //Init MediaSessionCompat and TransportControls 
     mSession = MediaSessionCompat(this, "MusicService") 
     mSessionToken = mSession?.sessionToken 
     mSession?.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS or MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS) 
     mTransportControls = MediaControllerCompat(this, mSession).transportControls 

     //EventBus Reg 
     eventBus.reg(this) 
     eventBus.post(GetAllMediaEventRequest()) 
    } 

    @Subscribe 
    fun onGetAllMediaEventResponse(event: GetAllMediaEventResponse) { 
     Timber.d("GetAllMediaEventResponse event.status = ", event.status) 

     //init PlaybackManager 
     mPlaybackManager = PlaybackManager(mPlayback = LocalPlayer(this), 
       mMediaData = event.mediaItems, 
       mServiceCallback = this) 
     mSession?.setCallback(mPlaybackManager!!.mMediaSessionCallback) 


     //Init Notification 
     try { 
      mMediaNotificationManager = MediaNotificationManager(this) 
     } catch (e: RemoteException) { 
      throw IllegalStateException("Could not create a MediaNotificationManager", e) 
     } 
    } 
} 

アップデート:私が持っているすべての応答のための

感謝。少しの研究の後、私はすべてのプロパティをnullableにしませんでした。私のコードをチェックし、間違いがあれば修正してください。

class MusicService : Service(), PlaybackManager.PlaybackServiceCallback { 

    //NotNull 
    private val mDelayedStopHandler = DelayedStopHandler(this) 
    private val eventBus = EventBus.getDefault() 

    //Lateinit 
    lateinit var mSessionToken: MediaSessionCompat.Token 
    lateinit var mTransportControls: MediaControllerCompat.TransportControls 

    //Lazy 
    private val mSession: MediaSessionCompat by lazy { MediaSessionCompat(this, "MusicService") } 
    private val mMediaNotificationManager: MediaNotificationManager by lazy { 
     try { 
      MediaNotificationManager(this) 
     } catch (e: RemoteException) { 
      throw IllegalStateException("Could not create a MediaNotificationManager", e) 
     } 
    } 
    val mPlaybackManager: PlaybackManager by lazy { 
     PlaybackManager(mPlayback = LocalPlayer(this), mServiceCallback = this) 
    } 

    override fun onCreate() { 
     LogHelper.d(TAG, "onCreate") 
     super.onCreate() 

     //Init MediaSessionCompat and TransportControls 
     mSessionToken = mSession.sessionToken 
     mSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS or MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS) 
     mTransportControls = MediaControllerCompat(this, mSession).transportControls 
     mSession.setCallback(mPlaybackManager.mMediaSessionCallback) 

     //EventBus Reg 
     eventBus.reg(this) 
     eventBus.post(GetAllMediaEventRequest()) 

    } 

    @Subscribe 
    fun onGetAllMediaEventResponse(event: GetAllMediaEventResponse) { 
     Timber.d("GetAllMediaEventResponse event.status = ", event.status) 
     mPlaybackManager.mMediaData = event.mediaItems 
    } 
} 
+2

'実際に、あなたが本当によくonCreate''で初期化し、すべてのプロパティをlateinit'に合う必要があるかもしれませんね。残りは 'onGetAllMediaEventResponse'が呼び出されるまで初期化されていないので、おそらくnull可能であるように思えます。 – zsmb13

+1

@Naetmulそれは本当ではない、lateinitはあなたが複数回割り当てることができないことを意味しません。それが 'val'のためのものです。 – Robin

答えて

1

は、私はあなたには、いくつかの

a?.let { 
    println(it) 
    // if `a` isn't null, the code will reach here 
    // and `it` will hold the value of `a` 
    // you can do a lot of things here without checking if it is null 
} 
関連する問題