2017-05-24 1 views
-2

저는 지금 꽤 많은 시간 동안 Kotlin을 사용하고 있지만, Kotlin의 모든 속성에 대해 not-null 유형을 얻을 수 없었습니다.어떻게하면 Kotlin의 null 속성을 피할 수 있습니까?

아래 코드를 살펴보면 null 유형을 사용해야하는 몇 가지 시나리오가 있습니다. lateinit을 사용할 수 있지만 일부 시나리오에서는 적합하지 않습니다. 내 코드에서 null을 피하는 방법은 무엇입니까?

누구든지 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 
} 
관련 문제