2017-10-06 5 views
0

가정하자, 나는코 틀린 부문

class Test { 
    var a: Double? = null 
    var b: Double? = null; 
    var c: Double? = null; 
} 

ab 다른 곳에 설정되어 다음과 같은 구조의 클래스를 가지고 있고, 인수 중 적어도 하나 인 경우 ca/b 또는 null로 계산되어야한다 null. Kotlin에서 이것을 달성 할 수있는 쉬운 방법이 있습니까?

나는 지금 그것을 다음과 같은 방법을 할 수있다 : 논리 외부 Test 클래스입니다

fun calculateValues() { 
    ... 
    val a = test.a 
    val b = test.b 
    if (a != null && b != null) 
    test.c = a/b 
    ... 
} 
+0

당신이 검색을 'c'와 같은 코드/메소드에서'a'와'b'를 전달합니까? – elect

+0

b가 0과 같지 않은지 확인하십시오. –

답변

0
test.apply { 
    c = if (a==null || b==null) null else a/b 
} 

: 다음 작업을 수행 할 수 있도록 어쨌든, if else는 코 틀린의 표현이기도하다

fun Test.updateC() { 
    c = if (a==null || b==null) null else a/b 
} 
: 테스트 당신의 클래스가 아닌 경우
class Test { 
    var a: Double? = null 
    var b: Double? = null 
    var c: Double? = null 
    get() = if (a==null || b==null) null else a/b 
} 

, 당신은 항상 확장 기능을 사용할 수 있습니다그리고 Test 클래스의 다른 함수와 마찬가지로 Test 인스턴스에서 호출 할 수 있습니다. test.updateC()

a/b를 계산할 때 Null 허용 여부를 확인하려면 표시된대로 임시 변수를 사용해야합니다 @ Joshua의 대답은 아래에 나와 있습니다. 또는 또한 다음과 같은 코 틀린 토론을 읽어 https://discuss.kotlinlang.org/t/kotlin-null-check-for-multiple-nullable-vars/1946/11 티켓 : https://youtrack.jetbrains.com/issue/KT-20294

나는 특히 기능이있는 재사용 가능한 솔루션과 같은 :로 사용할 수 있습니다

fun notNull(vararg args: Any?, action:() -> Unit) { 
    when { 
     args.filterNotNull().size == args.size -> action() 
    } 
} 

다음 : 수행

c = null 
notNull(a, b) { c = a/b } 
+1

'a == null'과'b == null'을 검사하는 것은'a/b'가 null 일 수 없다는 것을 보증하지 않습니다. IDE가 변경 가능하다는 경고를 했어야합니다. 당신이 그 (것)들에 접근 할 때마다 가치가 동일하다는 것을 보장하지 않습니다. – Joshua

+0

해당 케이스에 대한 답변에 연결됩니다. 또한보십시오 : https://discuss.kotlinlang.org/t/kotlin-null-check-for-multiple-nullable-vars/1946/11 –

2
class Test { 
    var a: Double? = null 
    var b: Double? = null 
    val c: Double? // It should be val as it is readonly 
     get() { 
      // This is need as a & b are mutable 
      val dividend = a 
      val divisor = b 
      if (dividend == null || divisor == null) 
       return null 
      return dividend/divisor 
     } 
} 
+0

정확히 원하지 않습니다. 클래스는 비즈니스 로직이 아닌 데이터 만 보유하고 있어야하며, 여전히 추가 코드 줄이 7 개 있습니다. – ekaerovets

+0

@ekaerovets 'c'는 항상 'a' 및'b' 만 사용하는 경우 데이터 중 하나로 간주되어야합니다. 또한 줄 수를 줄이려면 Nullable을 사용하지 않는 것이 가장 좋습니다. 고객 데이터 인 – Joshua

+0

이며 쉽게 null을 사용할 수 있습니다. 다른 클래스의 데이터가 필요한 필드가 있기 때문에 클래스 자체에서 c를 계산하지 않으려합니다. 따라서 클래스 Test의 모든 필드를 별도의 서비스로 계산하는 것을 선호합니다. 언어 디자인이 너무 좋지 않아서 /를 좋아하지 않습니다. – ekaerovets

0

으로 내가 작업을하기 전에 Null 허용 여부를 확인하는 문제를 찾을 수 없습니다. (다시 필드로 저장 C를 피할 수) C의 게터 포함 할 수 물론

val a = test.a 
val b = test.b 
t.c = if (a != null && b != null) a/b else null 
+0

그게 지금하고 있습니다. 문제는 꽤 간단한 작업에는 2 개의 추가 변수와 3 줄의 코드가 필요하다는 것입니다. – ekaerovets