2017-02-19 5 views
-1

저는 scala에 익숙하지 않고 기본값이 아닌 값으로 초기화되는 소수의 변수 (때로는 none) 만 필요로하는 클래스가 있습니다. 처음에는 빌더 클래스를 사용하여이 작업을 수행했지만, 생성자에서 스칼라의 기본값을 사용하는 것이 더 효율적이라는 것을 깨달았습니다. 문제는 꽤 끔찍 있도록 기본 값의 일부가,스칼라 : 단순하지 않은 기본값을 사용하는 방법?

처럼
val name: String = "Party-" + LocalDateTime.now.atZone(ZoneId.systemDefault()).toEpochSecond 

확인 좀 더 복잡한 String = "name" 또는 Int = 1 등 실제 코드를 필요로보다 있다는 것입니다,하지만에 고유 한 이름 요구 사항을 만족시킬 것이다 그 변수와 작동합니다.

private val now: LocalDateTime = LocalDateTime.now() 
private val dateFormat: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") 
private var startDate = dateFormat.format(now) 
private var startHour = now.getHour 

을 그러니 확실히 내가 기본값으로 모든 코드를 사용할 수 없습니다, 형식화 된 날짜와 기본값은 오늘부터 할 필요가 만족 무언가를 필요로

내가 다른 변수가 startDate 이전에 초기화 된 변수를 공유하므로이 두 변수에 한 줄을 사용할 수 없으므로 어떻게 구현해야합니까?

감사합니다.

+1

질문이 명확하지 않습니다. "분명히 모든 코드를'startDate'의 디폴트 값으로 사용할 수는 없지만, 이것에 대해서는 전혀 명백하지 않습니다. 나는 이것이 숙제라고 추측하고 있으며, 복합 표현식을 사용하여 변수를 초기화 할 수 없다는 제약이 있습니까? 아니면 회사 스타일 가이드가 금지하고 있습니까? 어느 쪽이든, 당신은 우리에게 질문에 * 정확하게 * 그 제한이 무엇인지를 말해야합니다. 왜냐하면 그것들은 결코 명백하지 않기 때문입니다. –

+0

충분히 공정하여 제 질문이 업데이트되었습니다. 물론 복합 표현을 사용하는 것이 가능합니다. 위에서 언급 한 것처럼 다른 변수를 사용할 수 있습니다. 더 좋은 방법이 될 것 같아요. 그럴 수 없으면 빌더를 사용해야합니다. 단일 변수의 –

답변

1

난 당신이 잘못된 길에 찾고 생각 : getOrElse에 대한 매개 변수는이 같은 블록이 될 수 있습니다. 스칼라는 강력한 형식 언어입니다. 따라서 모든 것을 유형으로 사용하는 것이 가장 좋은 방법이므로 사례 클래스를 작성하십시오. 긴 문자열에서의 예를 들어 보겠습니다. 이 경우 클래스 ctor를 만듭니다. 기본값은이 값입니다. 그렇지 않으면 init을 다른 것으로 바꿉니다.

+0

내가 분명히 뭔가를 놓치고 있었기 때문에 감사합니다. –

-1

무언가를 기본값으로 초기화하려면 var을 사용하지 마십시오. 돌연변이는 일반적으로 권장하지 않습니다.

"실제"값에 Option을 사용하는 것이 더 좋으며 getOrElse을 사용하면 "실제"값을 사용할 수없는 경우 기본값으로 되돌릴 수 있습니다.

myReal.getOrElse { 
    val now: LocalDateTime = LocalDateTime.now() 
    val dateFormat: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") 
    dateFormat.format(now) 
} 
+1

표시되는 코드는 빌더 클래스의 일부이므로 var를 사용해야합니다. 또한, 내 질문에 대답하지 않습니다 –

+1

@EladStern var은 빌더에 필요하지 않습니다. 각 메서드 호출 후에 새 개체를 반환 할 수 있습니다. – Kolmar

0

유스 케이스에 적합하지만 게으른 값이 문제를 해결할 수 있는지 확실하지 않습니까?

private val now: LocalDateTime = LocalDateTime.now() 
private val dateFormat: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") 
private lazy val startDate = dateFormat.format(now) 
private lazy val startHour = now.getHour 

그런 다음 당신은 단지 개체 생성시에 now를 초기화해야하고, 처음 사용할 때 다른 변수가 제대로 초기화됩니다.