2011-02-02 6 views
0

저는 블랙 베리 응용 프로그램을 리팩토링하고 있습니다. 현재 전역 변수를 사용하고 있다고 생각되는 시나리오가 있습니다.하지만 이것이 올바른지 확실하지 않습니다. 간단히 말해, 내 시나리오는 다음과 같습니다 -Blackberry 응용 프로그램 디자인 질문 - 싱글 톤

내 앱에 먼저 로그인해야합니다. (uid, pass)는 로그인이 유효한지 결정하고 추가 데이터를 반환하는 웹 서비스로 전송됩니다. (A 성공적으로 호출 로그인 후)

class UserDataModel 
{ 
    private String username; 
    private String password; 
    private String fullName; 
    private String age; 
    ... 
    /* Getters and Setters */ 


} 

나는 또한 사용자가 저장 한 모든 설정을 포함하는 UserPreferencesModel이 -이 같이 보입니다 내 응용 프로그램의 모델 객체가 있습니다. (나는 그들을 데이터베이스에 백업 할 필요가있다/장치 등을 통해 그들을 복원 할 필요가)

또한 일반적으로 모바일 개발의 컨텍스트에서 사용되는 글로 벌은 어떤 문맥입니까?

감사합니다.
Teja.

+0

이 될 수 있기를 바랍니다, 그래서 아마 당신은 당신이 수 있는지 여부에 대해 얘기하고 간단한 예제를 만들어 정적 필드 대 싱글 톤을 통해 액세스하는 대? –

+0

예, 정적 필드 만 사용하고 있습니다. –

답변

-1

정적 변수를 갖는 것이 좋은 시나리오입니다. 상수 문자열 필드와 같습니다.

여기 블랙 베리 플랫폼을위한 효율적인 코드 작성을위한 블랙 베리 공식 모범 사례 문서에 대한 링크입니다. 싱글 톤을 사용에 관해서 블랙 베리에 대한 특별한 것은 없지만

Black Berry: Best Practices: writing efficient code

1

. 물론, 진정한 상수는 그냥 정적이어야합니다. 그리고 모두 최종적이지만 Strings 여야합니다 : static final String이 코드에서 자주 재사용되는 경우 메모리 사용 패널티가 있습니다.

싱글 톤은 단일 제어 지점을 통해 상대적으로 긴 수명을 가진 복잡한 모델을 대체하거나 제거 할 수있는 기능을 제공합니다. 예제에서 DataModel은 좋은 후보입니다. BlackBerry는 개인용 장치이므로 사용자 프로필이있는이 DataModel과 추가 데이터가 활성 응용 프로그램의 수명 동안 생존 할 가능성이 큽니다. 그래서,

class UserDataModel 
{ 
    private static UserDataModel singleton; 

    public static void login() { 
     //get credentials 
     //authenticate 
     singleton = new UserDataModel(... user profile data...); 
    } 

    public static UserDataModel getInstance() { return singleton; } 

    private String username; 
    private String password; 
    private String fullName; 
    private String age; 
    ... 
    /* Getters and Setters */ 


} 

그 일의이 방법은 조금 단순화, 예를 들어, 유효한 것입니다. 무언가가 변경되면 (예 : 서버 호스트), 싱글 톤을 대체하기 만하면됩니다. 또한, UserDataModel 구현이 서버마다 다르다면 다형성 (polymorphism)을 사용할 수있는 가능성을 열어줍니다. 접근 자 체인에서 하나의 추가 변수를 사용하면 많은 이점이 있습니다. 다시 말하지만, 블랙 베리에는 특별한 것이 없으며,이 추론은 모든 자바 애플리케이션에서 유효합니다.

왜 예제가 단순화되는지는 스레드에 대해 생각해야하기 때문입니다. 어딘가에서 login()과 다른 스레드에서 getInstance()에 액세스 할 수있는 원격 기회가있는 경우에는 다른 개체에서 액세스/업데이트하여 간단한 개체 참조를 깨뜨릴 수 없었지만 올바르게 동기화해야합니다 BlackBerry에서 스레드).

2

글쎄, 나는 RuntimeStore를 사용하는 방법을 당신이 할 수있는, 내가 자바에는 전역이 없습니다이 도움이

public class myData 
{ 
long ID = 0xf46f5a7867d69ff0L; 
String d1; 
RuntimeStore runTS = RuntimeStore.getRuntimeStore(); 

public void setData(String _d1) 
{ 
    try 
    { 
     syncronized (runTS) 
     { 
      runTS.put(ID, _d1); 
     } 
    }catch(Exception ex){} 

} 

public String getData() 
{ 
    String s; 
    try 
    { 
     s = (String)(RuntimeStore.getRuntimeStore().get(ID)); 
    }catch(Exception ex){} 
    return s; 
} 
}