2017-11-02 20 views
2

String 변수의 값이 한 번 할당 된 후에 변경되지 않도록하려면 어떻게해야합니까? 과제는 선언 시점에 있지 않습니다.한 번 할당 된 후에 String 변수의 값을 변경하지 않으려면 어떻게해야합니까?

명확성 -

문자열 X = Y; (y는 다른 문자열 임) y를 변경해도 x가 변경되지 않아야합니다. 이것을 확인하는 방법?

내가 시도하는 것 : - : 주요 방법

public class MyDs { 
    private final String unitName; 

    public MyDs(String iUnitName){ 
     unitName = iUnitName; 

    } 

    public String getUnitName(){ 
     return unitName; 
    } 
} 

: - -

사용자 정의 클래스 작성

String iName = "xyz"; 

MyDs MyDsObj = new MyDs(iName); 

그러나 심지어이 후, 값이 변경됩니다 변수가 변경됩니다.

이 문제를 어떻게 해결할 수 있습니까? 이 싱글 톤 클래스를 만들기 싱글 클래스

+0

물어 보려는 내용이 명확하지 않은 정보를 더주십시오. –

+0

@AbdulWaheed 편집 된 질문을 참조하십시오. –

+0

x = y x는 y 주소를 가리 킵니다. 따라서 y가 변경되면 분명히 x가 변경됩니다. – Anonymous

답변

0

변경하여 MYDS 클래스는 최종 문자열 unitName 한 번만 업데이트 한 후 다시 변경할 수 없습니다 것을 보장합니다.

public class MyDs { 
    private final String unitName; 
    private static MyDs myDs; 

public static MyDs getMyDsObject(String iUnitName) { 
    if (myDs == null) { 
     myDs = new MyDs(iUnitName); 
    } 
    return myDs; 
} 

private MyDs(String iUnitName) { 
    unitName = iUnitName; 

} 

public String getUnitName() { 
    return unitName; 
} 

} 

다음은 값 "XYZ"는 unitName에 저장하고 "ZXY"로 변경하면 다시 업데이트됩니다 doesnot된다.

MyDs MyDsObj = MyDs.getMyDsObject("xyz"); 
Log.i("value", "" + MyDsObj.getUnitName()); 

MyDs MyDsObj1 = MyDs.getMyDsObject("zxy"); 
Log.i("value",""+MyDsObj.getUnitName()); 
+0

이 문맥에서 내가이 질문에 게시 한 코드와 어떻게 다른가요? –

+0

클래스는 싱글 톤이며 객체는 단 한 번만 생성됩니다. 스튜디오에서 이것을 테스트 했으므로 내가 원하는지 여부를 묻습니다. – Anonymous

+1

싱글 톤은 공용 생성자가 없어야합니다 ... – AxelH

0

클래스 이제 테스트 목적 코드 아래 사용 아래 코드에서

공용 클래스 TestingClas {

private String name; 

public void setName(String name) { 
    if (this.name == null && name != null) 
     this.name = name; 
} 

public String getName() { 
    return name; 
} 

}

을 언급 한 바와 같이 설계해야 할

TestingClas testingClas = new TestingClas(); 
    testingClas.setName("Abdul Waheed"); 
    testingClas.setName("You cannot change me any more now"); 

    String updatedString = testingClas.getName(); 

updatedString 변수가 이전 값을 갖게됩니다

+0

너는 그 문제를 이해하지 못했다. 내 문제는 입니다. String myStringVar = "xyz"; testingClas.setName (myStringVar); 나중에 myStringVar 값을 myStringVar = "abc"로 변경하십시오. 그런 다음 testingClas.getName()을 실행하면 "abc"가 반환됩니다. 대신 "xyz" –

+0

이 abc를 반환하지 않습니다. –

+0

귀하의 코드는 제가 질문에 게시 한 코드와 어떻게 다른가요? –

0

제가 이해하는 한, 변수를 최종적으로 디자인해야합니다. 이 접근법을 사용하여 생성자에서 설정 한 다음 아무 것도 변경할 수 없습니다. 보유하고있는 참조가 변경된 경우에도 값이 동일하게 유지됩니다. 즉, 새 오브젝트가 힙에 작성되고 최종 변수의 값이 동일하게 유지된다는 의미입니다. 아래는 변수 x를 한 번 설정하고 나중에 변경할 수 없게하는 일종의 디자인입니다. 물론 이것은 당신이 당신의 클래스 singelton 등

public class Test { 

    private final String x; 
    private String y; 


    public Test(String x){ 
     this.x=x; 
    } 

    public String getY() { 
     return y; 
    } 

    public void setY(String y) { 
     this.y = y; 
    } 

    public String getX() { 
     return x; 

    } 

} 
0

음을 만들 수 있습니다 수준의 범위에 대한 예를 범위에, 당신은 질문을 정말 명확하지 않다 (그리고 주석 부분은 정말 chaty입니다 ...)하지만, 경우 한 번만 값을 설정할 수는 있지만 초기화 중에는 설정할 수 없으므로 setter는 나쁜 선택이 아닙니다. 제약 조건을 추가하기 만하면됩니다.

public class MyClass{ 

    private static final String DEFAULT_VALUE = new String(""); 

    private String value = DEFAULT_VALUE; 

    public final void setValue(String value){ 
     if(this.value != DEFAULT_VALUE) //use the reference on purpose 
      throw new IllegalArgumentException("This value can't be changed anymore"); 

     this.value = value; 
    } 

    // Don't return `DEFAULT_VALUE` to prevent someone to gain access to that instance 
    public final String getValue(){    
     return this.value == DEFAULT_VALUE ? null : this.value; 
    } 
} 

이것은 런타임에 수행되지만,이 트릭을 할 것입니다.

이제는 변경할 수없는 인스턴스입니다. 일부 변경 가능한 인스턴스를 사용하면 원래 참조를 사용하여 수정 자일 수없는 복사본을 만들 수 있습니다.