在Kotlin中,如果您不想在构造函数或类体顶部启动类属性,则基本上有以下两个选项(来自语言参考): 延迟初始化 lazy()是一个函数,它接受一个lambda并返回一个Lazy实例,它可以作为实现一个lazy属性的委托:get()的第一个调用执行传递给lazy()的lambda并记住结果,随后的调用得到()只是返回记忆的结果。 例 public class Hello{ val myLazyString: String by lazy { “Hello” }` } 所以第一个调用和次要的调用,无论它在哪里, myLazyString都会返回“Hello” 延迟初始化 通常,声明为具有非nulltypes的属性必须在构造函数中初始化。 但是,这往往不方便。 例如,属性可以通过dependency injection来初始化,或者在unit testing的设置方法中进行初始化。 在这种情况下,你不能在构造函数中提供一个非null初始值设定项,但是当你引用一个类的内部属性的时候,你还是要避免使用null检查。 要处理这种情况,可以使用lateinit修饰符标记属性: public class MyTest { lateinit var subject: TestSubject @SetUp fun setup() { subject = TestSubject() } @Test fun test() { subject.method() } } 修饰符只能用于在类的主体内声明的var属性(不在主构造函数中),只有当属性没有自定义getter或setter时。 属性的types必须是非空的,并且不能是原始types。 那么,如何正确选择这两个选项,既然他们都能解决同样的问题呢?
我如何避免由我的应用程序创建的大量ConsPStack ? 什么时候创建? 我的申请: https : //github.com/Jire/Abendigo
环境:Cassandra 2.1,DataStax Driver 2.1.9,DSE 4.8单节点集群 我创建了一个表格: create table calc_data_test2( data_set_id uuid,svod_type text,section text,index_code text,value_type text,data_hash text,c1 text,c2 text,c3 text,c4 text,c5 text,c6 text,c7 text,c8 text,c9 text,c10 text,c11 text,c12 text,c13 text,c14 text,c15 text,c16 text,c17 text,c18 text,c19 text,c20 text,c21 text,c22 text,c23 text,c24 text,c25 text,c26 text,c27 text,c28 text,c29 text,c30 text,c31 text,c32 text,c33 text,c34 text,c35 text,c36 text,c37 text,c38 text,c39 text,c40 […]
我有两个相同的算法的实现。 我想validation他们是否使用了比所需更多的内存,换句话说,他们分配完全相同数量的对象。 我目前的解决方案是通过threadMXBean.getThreadAllocatedBytes(threadId)来测量过程之前和之后分配的字节数,并将其用作内存占用量的近似值。 问题是这个方法是不稳定的,有时它会返回比它应该更多的数字。 它特别显示了不分配对象的算法。 一个有问题的例子是一个总和int[] 。 实际代码(Kotlin): class MemAllocationTest { private val threadMXBean = (ManagementFactory.getThreadMXBean() as? com.sun.management.ThreadMXBean) ?: throw RuntimeException(“Runtime does not support com.sun.management.ThreadMXBean”) /** * May run [block] several times * */ private inline fun measureAllocatedBytes(block: () -> Unit): Long { val threadId = Thread.currentThread().id val before = threadMXBean.getThreadAllocatedBytes(threadId) block() val after = […]
我试图在Android Studio 3.0.1中剖析我的应用程序,但我看不到哪些方法正在使用CPU,下面包含调用图和火焰图的列表总是空的,我正在使用SDK 26进行编译,请检查截图(一些我的课程是在Java和一些在Kotlin):
编辑 :我知道关于支持属性,他们将涵盖大多数使用情况。 我不是在寻找解决办法,我特别关注是否有办法来命名支持领域。 您可以轻松地重命名属性的getter和setter,如下所示 @get:JvmName(“getFancy”) @set:JvmName(“setFancy”) var fancyProperty = … 但我不知道如何更改后台字段的名称,即使使用@field目标。 @field:JvmName(“fancy”) var fancyProperty = … 以上给出了一个错误: 此注解不适用于目标’具有后台字段的成员属性’,并使用站点目标’@field’ 最终我要做的是与JavaFX进行互操作。 当定义一个JavaFX属性时,通常遵循以下标准(使用一些额外的代码来使其懒惰): private ObjectProperty color = new SimpleObjectProperty(this, “color”, DEFAULT_COLOR); public ObjectProperty colorProperty() { return color; } public Color getColor() { return colorProperty.get(); } public void setColor(Color color) { colorProperty().set(color); } 所以我要做的是这样的(尽管@field显然不起作用): @field:JvmName(“color”) @get:JvmName(“colorProperty”) val colorProperty: ObjectProperty […]
我的问题是关于操作的成本,特别是Kotlin 数据类 copy()操作和RxJava observeOn()线程切换的成本。 我有一个系统产生的事件,让我们说Schedulers.mainThread 。 事件是Kotlin 数据类 。 接下来是业务逻辑,最后链通过copy()操作产生新的数据类 。 所有结果都必须在Schedulers.mainThread 。 所以,一条连锁店会是这样的: eventSource() //Events are produced on Schedulers.mainThread .observeOn(Schedulers.computation) .map { event -> other business logic event.copy(…) } .observeOn(Schedulers.mainThread) .subscribe(eventConsumer) 因此,如果事件类有15个字段,那么这个问题是值得通过observeOn来切换调度observeOn ,例如copy() 。 应该提到的是, Schedulers.mainThread是用于渲染UI的线程,最好是空置的。