2016-09-04 3 views
0

작년에 저는 모바일 개발자이자 기능 프로그래밍가였습니다.정적 형식 언어의 라이프 사이클 메소드

각 모바일 영역에는 앱의 고기를 구성하는 라이프 사이클 메소드가있는 구성 요소가 있습니다. 다음은 Android 및 Kotlin을 예로 사용하지만 iOS 및 Swift에도 동일하게 적용됩니다.

Android에는 onCreate()과 같은 라이프 사이클 메소드가있는 Activity이 있습니다. 이름이 나타내는 것과 정확히 일치하는 함수 onButtonClicked()을 정의 할 수도 있습니다. 질문의 목적을 위해

, 이제 버튼 클릭 핸들러 onButtonClickedPrintMessageLength()에 사용되는 onCreate()에 정의 된 변수가 말할 수 있습니다 (이것은 대개의 경우 이 - onCreate()은 본질적으로 Activity의 설정 방법입니다).

예 클래스는 다음과 같이 보일 것이다 :

class ExampleActivity: Activity() { 
    var savedStateMessage: String? = null 
    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 

     savedStateMessage = "Hello World!" 
    } 

    fun onButtonClickedPrintMessageLength() { 
     System.out.println(savedStateMessage?.length) 
    } 
} 

유의 사항 String? (널 (NULL) 문자열)로 savedStateMessage의 선언과 ?. (null의 안전 호출)의 사용. 컴파일러가 onCreate()onButtonClickedPrintMessageLength() 전에 호출 될 것을 보장 할 수 없기 때문에 이러한 작업이 필요합니다. 하지만 개발자로서, we know that onCreate will always be called first***.

내 질문은 어떻게 이러한 방법의 보장 된 순서에 대해 컴파일러에 알리고 null 검사 동작을 제거 할 수 있습니까?

*이 나는 new까지 우리 ExampleActivity에 가능 가정 따라서 안드로이드 프레임 워크와 라이프 사이클 방법을 피하는 직접 onButtonClickedPrintMessageLength() 부르지 만, 흥미로운 아무것도 전에 일어난 컴파일러/JVM 오류로 실행 가능성이있다.

** onCreate이 먼저 호출된다는 보장은 안드로이드 프레임 워크에서 제공합니다. 안드로이드 프레임 워크는 외부의 진원이며 앞으로 다르게 작동 할 수 있습니다. 모든 안드로이드 애플 리케이션이 진실의 근원을 기반으로하지만, 나는 그것이 안전하다고 믿습니다.

lateinit var savedStateMessage: String

당신은거야 :이 실제 질문에 대답하지는 않지만

+0

컴파일러에게 메소드의 순서를 알릴 수는 없지만 유형을'String'으로 강요하고 쓸모없는 기본값 인'var savedStateMessage : String = "default stupid value"'를 제공 할 수 있습니다. –

+0

이 질문을 관련 프로그래밍 언어/환경별로 별도의 질문으로 나누십시오. 당신이 문제를 풀지 않는다면, 오직 하나만 받아 들일 수 있다고해도 여러 답이 맞을 수 있습니다. – ColGraff

+0

나는 당신과 ColGraff에 동의합니다. 나는이 질문을 두 가지로 구분해야했다 : 하나는 안드로이드 용이고 다른 하나는 iOS 용이다. 다음에 나는 한 가지만 물어 보거나 두 가지 질문을 만듭니다. – codysehl

답변

6

, 코 틀린에 당신은 당신이 시간에 나중에에 var를 초기화 할 수 있습니다 컴파일러에게 lateinit을 사용할 수 있습니다 초기화하기 전에이 변수를 사용하려고하면 매우 구체적 인 UninitializedPropertyAccessException을 얻으십시오. 이 기능은 일반적으로 @Before-annotated 메소드의 변수를 초기화하는 JUnit과 onCreate()의 생성자에 액세스하거나 초기화하지 않는 Android Activity s와 같은 유스 케이스에 유용합니다. 만약 Optional 내재적 래핑 사용할 것 인

+1

이것은 정확히 올바른 방법입니다 – voddan

0

스위프트 이것은이다 예의 두번째 라인 String 끝에 오퍼레이터 !를 사용함으로써

class Example: CustomStringConvertible { 
    var savedStateMessage: String! // implicitly-unwrapped Optional<String> 
    var description: String { return savedStateMessage } 
    init() { 
    savedStateMessage = "Hello World!" 
    } 
} 

print(Example()) // => "Hello World!\n" 

당신 변수가 될 것으로 유망한 사용할 수 있기 전에 설정하십시오.이는 예제의 init 메소드에서 수행됩니다. 여전히 Optional이지만 코드는 각 사용 전에 자동으로 풀어 지므로 String으로 처리 할 수 ​​있습니다. 변수가 액세스되거나 런타임 예외가 생성 될 수있는 경우 변수가 절대로 nil으로 설정되지 않도록주의해야합니다.

+0

실수로'myCustomStringConvertable.description = null'을 쓰는 경우 컴파일러에서 경고를 생성합니까? 이상하게도 컴파일러는 변수를 null로 설정했을 때 소리를 지르지 만, 컴파일러가 변수를 초기화하지 않았는지 확인하지 못하면 나에게 소리를 지르지 않습니다. – codysehl

1

또 다른 대답에서 언급 한 것처럼 은 초기화 시점을 보장주기 ()로 연기하는 옵션으로 사용할 수 있습니다. 또 다른 방법은 대리자를 사용하는 것입니다.

등가입니다. 변수를 초기화하기 전에 액세스하면 오류가보고됩니다.

관련 문제