-2
我從一段時間以來一直在使用Kotlin,但是我無法實現Kotlin中所有屬性的非空類型。我該如何避免Kotlin中的空屬性
請看下面的代碼,有一些場景我必須使用空類型。我知道我可以使用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)
}
}
}
更新:
謝謝,我已經得到了所有響應。經過一番研究,我讓所有的房產都不可空。請檢查我的代碼並糾正我是否有任何錯誤。
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
}
}
'lateinit'將適合所有你在'onCreate'初始化很好的性能,其實。剩下的看起來應該是可以爲空的,因爲它們在調用onGetAllMediaEventResponse之前不會被初始化。 – zsmb13
@Naetmul這不是事實,lateinit並不意味着你不能分配多次。這就是'val'的意思。 – Robin