Tag: 属性

计算只读属性与Swift中的函数

在Swift简介会上,演示了一个只读的属性description : class Vehicle { var numberOfWheels = 0 var description: String { return "\(numberOfWheels) wheels" } } let vehicle = Vehicle() println(vehicle.description) 是否有任何意义,而不是使用一种方法来选择上述方法: class Vehicle { var numberOfWheels = 0 func description() -> String { return "\(numberOfWheels) wheels" } } let vehicle = Vehicle() println(vehicle.description()) 在我看来,你会选择一个只读计算属性的最明显的原因是: 语义 – 在这个例子中, description是类的一个属性,而不是它执行的动作。 简洁/清晰 – 防止在获取价值时使用空圆括号。 显然,上面的例子过于简单,但是还有其他很好的理由选择一个吗? […]

JavaFX绑定和空值

我想知道如何绑定绑定的来源可能为null的值。 我有一个属性: private ObjectProperty<Operation> operation = new SimpleObjectProperty<>(null); 我也有一个文本字段: @FXML private Text txtCurrentOperation; 我想将字段的textProperty绑定到操作对象的值。 我的第一个想法是使用FluentAPI的时候/然后/否则构造,但它是热切的评价,所以解决方案: Bindings.when(operation.isNotNull()) .then("null") .otherwise(operation.get().getName())); 会抛出一个NPE,因为不管什么时候的结果, otherwise参数都被评估。 我的下一个想法是不知何故使用lambda: txtCurrentOperation.textProperty().bind(() -> new SimpleStringProperty( operation.isNotNull().get() ? "Null" : operation.get().getName() )); 但绑定没有启用lambda的解决方案。 (后来我意识到它不可能有,因为真正的工作倒退:绑定对象(操作)的更改将触发活页夹(字段文本属性)的更新。) 我发现一些文章建议使用属性的“极值”值而不是null。 但是Operation是一个复杂而重量级的组件,所以构造一个人工实例来表示null是不平凡的。 更重要的是,这在我看来锅炉代码,这是一个绑定机制旨在帮助消除。 我的下一个尝试是逻辑交换绑定的方向,并添加侦听器的操作属性,并让它以编程方式更新字段。 它的工作原理相当简单,只要更新的需要只取决于操作对象实例: operation.addListener((e) -> { txtCurrentOperation.setText(operation.isNull().get() ? "Null" : operation.get().getName()); }); operation.set(oper); 它比较简单,但不起作用:它会抛出“无法设置绑定值”。 例外,我不明白为什么控制的文本属性被视为绑定。 我跑出了想法。 经过大量的搜索,我仍然不能解决简单的问题来根据源是否为空来不同地更新文本字段。 这似乎是如此简单和日常的问题,我相信我错过了解决方案。

从Delegate属性的getValue()和setValue()函数外部获取KProperty信息

我试图用委托Kotlin属性实现JavaFX Property接口,以便它可以像这样使用: class Foo(bar:Bar){ val barProperty=PropertyFX(bar) var bar by barProperty } 我为此写了一个小类(大部分): class PropertyFX<T>(value:T):SimpleObjectProperty<T>(value),ReadWriteProperty<Any?,T>{ override fun getValue(thisRef:Any?,property:KProperty<*>)=get() override fun setValue(thisRef:Any?,property:KProperty<*>,value:T)=set(value) } 但是,这个类没有实现接口的getBean()和getName()方法。 它们应该分别从getValue()和setValue()函数中引用的参数中返回值thisRef和property.name,但是我不能从函数外部访问这些参数。 我可以在第一次使用时存储这些值,如下所示: class PropertyFX<T>(value:T):SimpleObjectProperty<T>(value),ReadWriteProperty<Any?,T>{ private var bean:Any?=null private var name="" override fun getBean()=bean override fun getName()=name override fun getValue(thisRef:Any?,property:KProperty<*>):T{ bean=thisRef name=property.name return get() } override fun setValue(thisRef:Any?,property:KProperty<*>,value:T){ bean=thisRef name=property.name set(value) } 但是,这似乎是一个可怕的黑客攻击,它不返回正确的值getBean()和getName(),直到该属性被访问一次。 有没有办法获得这些值,而不需要传递给构造函数,就像SimpleObjectProperty所要求的那样 […]

什么是开放的财产? 为什么我不能让自己的私人?

Kotlin的房地产和开放式房产之间有什么区别? 下面的代码抱怨我声明setter 私有和Intellij说私人 setter不允许打开属性。 什么是开放的财产? @RestController open class ParameterController { @Autowired lateinit var parameterRepository: ParameterRepository private set //error } 为什么上面的代码无效,但是这个代码是? open class ItemPrice{ lateinit var type: String private set // ok } 编辑:我使用spring-allopen插件,并明确标记类作为打开没有区别。

Kotlin:我怎样才能得到一个成员财产的代表团类?

我怎样才能得到一个成员属性的委托类? 通过这个,我的意思是有可能完成这样一个功能: inline fun <reified T> delegationExample(t: T) { for (prop in T::class.declaredMemberProperties) { val delegatedClass = // what to do?! } } 代表团可能看起来像这样: class DelegationExample { operator fun getValue(ref: Any, prop: KProperty<*>) = 0 } 而声明类可能是这样的: object Example { val a by DelegationExample() val b by DelegationExample() val c by DelegationExample() }

如何让一个数据类在Kotlin中实现Interface / extends Superclass属性?

我有几个数据类,其中包括一个var id: Int? 领域。 我想在接口或超类中表达这个,并且有数据类扩展,并在构造时设置这个id 。 但是,如果我尝试这样做: interface B { var id: Int? } data class A(var id: Int) : B(id) 它抱怨我重写id字段,我哈哈.. 问 :在这种情况下,如何让数据类A在构造时使用一个id ,并将接口或超类中声明的id设置为?

Kotlin – 如何使用自定义名称制作地图代理?

我试图让我的头绕着财产代表,我有一个有趣的用例。 有没有可能有这样的事情: class MyClass { val properties = mutableMapOf<String, Any>() val fontSize: Any by MapDelegate(properties, "font-size") } 这将允许我使用地图作为fontSize存储fontSize ,但使用自定义键(即“font-size”)。 如果用于存储诸如可以通过变量( fontSize )访问的用于代码的CSS属性标记的特定用例,但是在遍历地图( font-size: 18px; )时可以正确渲染。

接口中的属性不能有后台字段

我正在学习Kotlin 。 我的代码如下: interface BaseLogicDecoupler<A : BaseViewNotifier, B : BaseScreenRouter> { var notifier: A? var router: B? fun attachNotifier(notifier: A?) { this.notifier = notifier } fun detachNotifier() { notifier = null; } fun attachRouter(router: B?) { this.router = router } fun detachRouter() { router = null; } } 但是,当我改变它,并尝试提供像以下属性的访问器: var notifier: A? get() = notifier […]

Kotlin由线程局部的懒惰代表财产

有没有一种简单的方法by lazy像ThreadLocal这样每个线程计算出by lazy值来获得委托属性? LazyThreadSafetyMode控制并发初始化, .NONE通过允许多个线程接收不同的值而接近所需的功能,但后续的后期初始化调用引用相同的对象,不管线程返回相同的奇异值,有些情况返回null 。 无论并发初始化还是后期初始化,该属性都会为每个线程缓存一个唯一的值。

Kotlin:我如何避免委托属性中的自动装箱(垃圾)?

在我的软件中,我有一些使用财产授权的各种价值。 这是一个简单的类似的例子,显示了我的工作: class ExampleDelegate<T>(val value: T) { operator fun getValue(thisRef: Any?, property: KProperty<*>) = value } val example by ExampleDelegate(1000) // number larger than 127 (no box cache) 然而,我注意到,引用这个值似乎在EVERY引用上创建了一个自动绑定的对象( java.lang.Integer )。 因为这个值必须每秒钟被引用数百万或者几百次,所以这会导致我的软件产生大量垃圾。 垃圾收集器上放着沉重的压力。 有没有办法避免开销? 如果不是直接的话,有没有什么聪明的方法来“效仿”性能的代表性? 在YouTrack上提交了一个错误报告: https ://youtrack.jetbrains.com/issue/KT-13606