그것은 안전 자바 필드를 설정하는 데 코 틀린 속성 액세스 구문을 사용하는 것입니다

Belzebub :

이 가상의 질문입니다. 상황은 다음과 같다 : 나는 개인 필드의 값을 변경하기 위해 코 틀린 파일에서 자바 클래스의 세터를 호출하고x

javaFoo.setX(420)

IDE는로 변경하는 제안

javaFoo.x = 420

그것은 일반적으로 작동합니다.

이제 세터가 일부 복잡한 기능의 내부가 나중에에 가정 x자바 클래스의 필드가 변경됩니다 public대신 private. 아무 컴파일 오류가 없을 것이다 그러나 코 틀린 호출의 값이 변경됩니다 x세터에서 일어나는 다른 물건을 건너 뛰는를, 그리고 그것을 논리적 오류의 원인이 주목 갈 수 있습니다. 따라서 내가 궁금 : 그것은 자바 필드를 설정하는 데 코 틀린 속성 액세스 구문을 사용하는 것이 안전합니까?

마르코 Topolnik :

언어 의미의 분석은 정확합니다. 당신이 설명하는 대상 클래스의 변화는 참으로 코 틀린의 속성 액세스 구문의 의미를 변경합니다. 그러나, 사실은 구문을 사용하는 여부를 묻는 질문, 대답 할 때 고려해야하는 유일한 것이 아니다 안전을 .

실제 생활의 제약없이 가상 시나리오를 논의 할 때, 거의 아무것도 가능하며 어떤 언어 구조는보기에 따라 "안전"입니다. 무슨 일이, 경우에 어느 날 코 틀린 팀의 의미 변경하기로 결정 x++을 의미하는 "반환 x, 변경하지 제곱 x?" 이론적으로, 그것은 가능합니다. 그것은 비록 가능성이 있습니까?

귀하의 질문에 같은 상식적인 논리를 적용, 클래스의 메인테이너 지금까지 사용자 지정 논리와 세터 뒤에 숨겨진 된 필드의 캡슐화를 중단하기로 결정 시나리오는 매우 어렵다. 모든 자바 라이브러리 프로젝트의 기록 분석을 할 경우에 실제로, 당신은 아마 이제까지 일어난 데이의 단일 인스턴스를 찾을 수 없습니다.


그게 당신의 가상 시나리오 바로 가기 구문 실제 문제에서주의 산만으로 볼 수있다. 그것은 어색하고 우리의 직관을 나누기 때문에 사용자 지정 논리와 세터를 호출하는 데 사용하는 오해의 소지가 될 수 있습니다.

안드로이드에서 하나의 예입니다 ImageView.get/setImageMatrix. 당신은 쓸 수 있습니다

imageMatrix.rotate = 30

그리고 그 영향을 미칠 것으로 예상하지만, 실제로 당신이 쓴 코드가 파손됩니다. 당신은 실제로 작성해야

val tmpMatrix = Matrix()
tmpMatrix.set(imageMatrix)
tmpMatrix.rotate = 30
imageMatrix = tmpMatrix

우리의 자바 직관함으로써, 외모는 겉으로 목적을 위해 객체 할당을 낭비 깨진 것을이 버전은 사실이다. 당신의 계약을 읽는다면 setImageMatrix, 당신이 아주 조금 더 그냥 필드에 개체를 할당보다 않습니다 실현거야, 실제로 이미지보기로 변환을 적용합니다. 마찬가지로, 게터의 계약은 반환 된 객체를 돌연변이 허용하지 않습니다.


나는 코 틀린의이 기능을 통해 많은 인수를 보지 못했다,하지만 난 자바에서 마이그레이션하는 사람들에 대한 버그의 잠재적 인 소스로 참조하십시오. 가는 방법은 코 틀린의 모든 속성 액세스가 훨씬 더 눈에 보이는 것보다 더 의미 있다는 사실에 자신을 민감, 당신의 직관을 다시 양성하는 것입니다.

추천

출처http://43.154.161.224:23101/article/api/json?id=182301&siteId=1