Tag: kotlin null safety

我需要关于Java中的null安全性的建议

我一直在阅读关于java中的beeing null safe的文章,以及如何return null或那个传递null作为参数的错误。 我得到它简化了生活,人们并不总是阅读文档,所以他们不知道方法可以return null ,或者如果null可以传递给它。 注释似乎只是污染了代码,并没有像Kotlin一样的无效安全机制。 在我目前的项目中,我尝试以这种方式设计所有的东西,至少对于最终用户来说几乎是不需要的。 我想创建一个更改监听器(类似javafx.beans.value.ChangeListener ),以便我可以传递一个以前和当前值的changed()方法。 事情是,我希望它是无效的,所以我不想永远传递一个null作为参数,即使它可以从无值改变到某个值,或者从某个值改变为无值。 我可以为这种情况添加两个额外的方法,并有类似的东西: public inteface ChangeListener { void valueSet(T current); void valueChanged(T previous, T current); void valueCleared(T previous); } 这种方法似乎过分。 我也可以使用java.util.Optional作为参数,但增加了额外的装箱: public inteface ChangeListener { void changed(Optional previous, Optional current); } 有更优雅的选择吗? 还是应该强制用户使用某种空对象模式 ? 虽然这会造成需要扩展一些类的问题。 我也可以停止关心,在文档中指定如果使用null ,会发生什么情况,并让用户find所有NullPointerExceptions的来源。

Java to Kotlin转换器和可空方法参数

我遇到了一个Java到Kotlin转换器不能将方法参数标记为可空的情况,使我失败的案例。 示例:使用registerActivityLifecycleCallbacks跟踪活动生命周期: registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) {} @Override public void onActivityStarted(Activity activity) {} @Override public void onActivityResumed(Activity activity) {} // … other overriden methods }); 将此代码粘贴到Kotlin结果中: registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks { override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle) {} override fun onActivityStarted(activity: Activity) {} override fun onActivityResumed(activity: Activity) {} override fun […]

Kotlin可为空的variables赋值

在Kotlin中,这个代码是否有更简短的语法: if(swipeView == null){ swipeView = view.find(R.id.swipeableView) } 首先我试过这个: swipeView ?: view.find(R.id.swipeableView) 但后来我意识到这不是一个任务,所以代码什么都不做。 然后我试着: swipeView = swipeView ?: view.find(R.id.swipeableView) 哪个工作,但有点冗长。 我会期待这样的事情: swipeView ?= view.find 但不幸的是,这是行不通的。 有没有什么办法用一个简短的语法来完成这个? 我知道我可以这样做: variable?.let { it = something } which works.

在可能为空的接收器types的数组列表中,只允许安全或非空的确定的呼叫

刚开始使用kotlin进行android开发。我的arraylist被声明为这样 – var day1: ArrayList? = null 现在我试图通过它的位置访问一个元素 val dietPlan= day1[position] 但我正在编译时间错误, 在可能为空的接收器types的数组列表中,只允许安全或非空的确定的呼叫 为什么我得到这个错误,我该如何解决?

智能投射到kotlin.String

我正在尝试Kotlin并从编译器得到消息: Smart cast to kotlin.String 码: /*”mTripStatus” is a nullable String*/ var html :String = HTML html = if (mTripStatus!=null) html.replace(“TRIP_STATUS_VALUE”, mTripStatus) else html 这是什么意思?

如何在基本types中使用kotlin中的@Autowired或@Value等Spring注解?

使用类似Spring的注释自动assembly非基元 @Autowired lateinit var metaDataService: MetaDataService 作品。 但是这不起作用: @Value(“\${cacheTimeSeconds}”) lateinit var cacheTimeSeconds: Int 有一个错误: 基元types不允许使用lateinit修饰符。 如何autotire primitve属性到kotlin类?

什么时候应该使用let {},什么时候只是简单的!= null

你会怎么写更多的kotlinic方式下面的代码? var returnValue = … val s3data = presignedUrl.body() if (s3data != null) { val uploadImage = api.uploadImage(s3data.bucketUrl, s3data.awsAccessKeyId, s3data.policy, s3data.key, s3data.signature, body).execute() if (!uploadImage.isSuccessful) { crashReporterService.sendIssue(“Failed uploading file”, “Failed uploading file ${uploadImage.raw()}”) returnValue = Result.FAILURE } else { returnValue = Result.SUCCESS } } else { crashReporterService.sendIssue(“Failed uploading image”, “Error – ${presignedUrl.raw()}”) returnValue = Result.FAILURE […]

什么是Kotlin double-bang(!!)运算符?

我使用Android Studio将Java转换为Kotlin。 在实例variables之后,我得到了双重爆炸。 什么是双重的,更重要的是这个记录在哪里? mMap!!.addMarker(MarkerOptions().position(london).title(“Marker in London”))

只有在右侧不为空的情况下才能分配更好的方法?

在Kotlin中,我只想在另一个variables不为空的情况下做一个赋值操作(否则,不操作)。 我可以想到两个简洁的方法: fun main(args: Array) { var x: Int? = null var n = 0 // … do something … x?.let { n = it } // method 1 n = x ?: n // method 2 } 不过,考虑到我必须做的频率,他们不够简洁。 第一种方法似乎是矫枉过正。 第二种方法是在需要expression式之后唠叨?: 我怀疑一定有更好的办法,比如n =? x n =? x ? 或者n = x? ? 在那儿?

有没有办法从一个范围创建一个非null数组?

在Java中,可以使用传统的for循环创建一个简单的数组: ImageButton[] buttons = new ImageButton[count]; for (int i = 0; i < count; i++) { buttons[i] = view.findViewById(BUTTON_IDS[i]); } 简单的转换为Kotlin会产生以下结果: val buttons = arrayOfNulls(count) for (i in 0..count) { buttons[i] = view.findViewById(BUTTON_IDS[i]) } 这个问题是,现在数组中的每个元素是可选的; 这与我的代码谜语? 运营商。 有没有办法以类似的方式创建一个数组,但没有可选的types?