2011-01-31 9 views
12

어떻게 다음 Java 코드를 Scala로 변환 할 수 있습니까?스칼라 인스턴스 변수 모범 사례

class ClassA { 
    private int field1; 
    private int field2; 

    public ClassA() { 
     field1 = 1; 
     field2 = 2; 
    } 
} 

나는 두 가지 옵션을 볼 수 있습니다

class ClassA(val field1: Int, val field2: Int) { 
    .... 
} 

또는

class ClassA { 
    val field1: Int = 1 
    val field2: Int = 2 
} 

추천 무엇, 그리고 왜?

+0

Java 버전에서는 두 필드가 모두 비공개이고 표시된 스칼라 대안에서는 public이므로 두 버전 모두 동일합니다. 아마도 당신은 달성하고자하는 것에 대해보다 구체적으로 관심을 가질 것입니다. –

답변

4

개인 필드가 필요한 경우 비공개 필드를 선언해야하는 이유는 무엇입니까?

class ClassA { 
    private val field1: Int = 1 
    private val field2: Int = 2 
} 
5

가장 큰 차이점은 클래스 매개 변수 1을 생성자로 사용할 수 있다는 것입니다. Java 예제처럼 생성자에 매개 변수가 없도록하려면 두 번째 매개 변수를 사용해야하고 @Debilski가 제안한 private 수정자를 추가해야합니다.

또 다른 옵션은 생성자에서 기본 매개 변수를 사용하는 것입니다. 필요한 경우 필드가 변경 될 수 있습니다 그 방법 : 당신이 항상가 필드 1을 원하는 FIELD2는 클래스 A의 각 인스턴스에 대해 동일한 값이있는 경우

class ClassA (private val field1: Int = 1, private val field2: Int = 2) 

// Using defaults 
val a = new ClassA 

// Setting new values 
val b = new ClassA(3, 4) 
+0

이것은 좋은 해결책이지만 OP의 Java 코드와 동일하지 않습니다. – Raphael

+0

@Raphael 사실입니다. 하지만 주어진 Java 예제가 그 자체로는 꽤 무의미 해 보였으므로 몇 가지 옵션이 흥미로울 수 있다고 생각했습니다 :) – eivindw

1

, 나는 동반자 모듈에 넣어하는 것이 좋습니다 것입니다 : 다음

object A { 
    private val field1 = 1 
    private val field2 = 2 
} 

그리고는 클래스 A에서 사용 :

class A { 
    def complexInternalComputation = 2*A.a 
} 

또는 이런 식으로 :

class A { 
    import A._ 
    def complexInternalComputation = 2*a 
} 
+0

이것은 작동하지 않습니다. 'A.a'는 private이기 때문에 A 클래스의 인스턴스에서 접근 할 수 없습니다. – Raphael

+0

스칼라 사양 §5.2에서 : • 전용 수정자는 템플릿의 정의 또는 선언과 함께 사용할 수 있습니다. 그러한 구성원은 직접 둘러싸인 템플리트 및 동반 모듈 또는 동반 클래스 (§5.4) 내에서만 액세스 할 수 있습니다. – Nicolas

+0

그러나 REPL에서는 실패하지만 파일에서 작동합니다. – Nicolas

16

자바에서 스칼라 간단한 번역은이 상황에,이 달려 없다 :

  • 자바에서 가변 변수 있습니까? 그렇다면 (그렇지 않으면 자바에서 최종적인 것이어야한다.) 스칼라에서 불변으로 만들 수 있다는 것이 맞을 까?
  • 생성자가 스칼라에 공개되어야합니까? 공장이 될 수 있습니까 (예 : 의 적용 메소드). 더 적절합니까?
  • 은 개인 변수입니까? 그들은 getter 및/또는 setter가 있습니까?
  • 변수가 필요한 경우 게으르다는 것이 맞습니까?
  • 값이 변경되지 않고 노출되면 패턴 일치에 유용할까요? 사례 수업이 올바른 선택일까요?
  • API 및 액세스를 단순화하기 위해 변수를 그룹화 (예 : 튜플) 할 수 있습니까?

많은 고려 사항이 있습니다. 스칼라의 가능성에 대해 배우고 다른 접근법을 가지고 놀아 볼 것을 제안합니다. 그렇지 않으면 필요한 것보다 더 오래 "스칼라로 더 나은 Java"함정에 빠지게됩니다.

class ClassA{ 
    private var field1 = 1 
    private var field2 = 2 
} 

var 대신 val의 사용 :

8

이 스칼라 가장 직접적인 번역이다. val은 Java에서 public final에 해당하는 변경 불가능한 필드입니다. 따라서 나중에 변경할 수 없으며 주어진 필드에 대해 올바른 값으로 필드를 초기화하는 방법을 제공하는 것이 중요합니다.

당신이 무엇을 사용하기로 결정하기 위해서 당신은 Landei의 대답에 열거 된 질문을 스스로해야합니다.

+0

Java 개인 변수는 private가 아닌 private 클래스이기 때문에 [this]를 삭제해야합니다. – Submonoid

+0

@Submonoid 고맙습니다. 내가 항상 잘못한 것처럼 보입니다. :) – ziggystar