2010-08-02 2 views
7

가능한 중복 :
Why is String final in Java?String 클래스가 왜 마지막입니까?

내가 바란 내 프로그래밍 삶의 다양한 순간이있는 String 클래스는 최종/밀봉/NotInheritable이 아니었다.

저를 막으려 고 시도한 언어 설계자는 원숭이 렌치를 작업에 던질 것입니다.

대신 언어 설계자가 String 클래스 확장을 제한하여 작품에 던지지 못하게하려는 원숭이 렌치는 무엇입니까?

확장형 문자열 클래스의 장단점 목록을 나열 할 수 있습니까?

+0

마지막으로 봉인 된 숫자와 같은 다른 클래스가 있음을 알고 있습니다. 먼저 String을 분석하여 시작할 수 있지만 주석을 String으로 제한 할 필요는 없습니다. –

+0

+1 ... 나는 또한 왜 내 기억이 없어도 String 클래스를 확장하기를 원한다. –

+0

java (태그)에 대해 언급했듯이, 이전에 요청을 받았다. http://stackoverflow.com/questions/2068804/why-is-string-final-in-java –

답변

5

문자열은 immutable class입니다. 문자열을 만들면 해당 상태를 수정할 수 없습니다. 문자열이 다른 라이브러리 나 Map에 입력 된 후 문자열을 수정할 수있는 경우 결과는 예측할 수 없습니다.

Java API의 한 가지 실수는 BigIntegerBigDecimal이 최종적이지 않다는 것입니다. 이는 신뢰할 수없는 코드로부터 수신 할 때 이러한 객체의 방어 복사본을 수행해야한다는 것을 의미합니다. 반대로 항상 String이 일관성있게 유지 될 것이라고 믿을 수 있습니다.

신뢰할 수없는 BigInteger를 :

public class DestructiveBigInteger extends BigInteger { 

    public DestructiveBigInteger(String value) { 
     super(value); 
    } 

    public BigInteger add(BigInteger val) { 
     return BigInteger.ONE; // add() method does not behave correctly 
    } 

    public BigInteger subtract(BigInteger val) { 
     throw new UnsupportedOperationException("subtract is broken"); 
    } 
} 

같은 일이 String 불가능합니다. Effective Java에 명시된 바와 같이, 당신은 이러한 유형의 객체의 방어 복사본을 만들 필요가 불변의 데이터 유형을 나타 내기 때문에

public void setValue(BigInteger value) { 
    this.value = new BigInteger(value.toByteArray()); 
} 
+0

정교한, pls. –

+1

* final * 키워드와 * sealed * 키워드의 차이점을 알고 있어야합니다. * final *로 표시된 클래스는 ALSO * 효과적으로 봉인되어 있지만 * 최종 * 키워드의 실제 포인트는 아닙니다. A final 클래스는 ** immutable **이며, 생성 후에는 수정할 수 없습니다. 변경할 수없는 클래스도 봉인되어야합니다. 그렇지 않으면 상속, 대체 및 일부 불변하지 않는 동작을 추가 할 수 있습니다. 변경 가능한 문자열이 ** 위험하므로 ** 솔직히 말해서 가치가있는 것보다 더 많은 문제가 있기 때문에 문자열이 Java에서 변경 불가능합니다. 대부분의 현대 언어 (Python, Javascript, C#, Java)는 불변 문자열을 사용합니다. – Ender

4

문자열이 마지막이다. Manifold terribleness는 String 객체의 불변성에 의존하는 라이브러리가 많기 때문에 String을 순진하게 확장하면 생깁니다.

문자열을 변경할 수 있도록 확장하면 스팅이 통과하는 코드에는 보이지 않지만 HashMaps에서 값을로드 할 수없는 갑작스러운 부작용이 발생할 수 있습니다. 키는 해시 코드가 도용 당했기 때문에

+0

지도의 키에 String을 사용하려면 String을 사용합니다. 확장 String을지도의 키로 사용하려면 기본 String 객체로 액세스하지 못하도록하고 싶습니다. 불변의 주장은 나에게 물을주지 않는 것 같습니다. –

+0

그러나 확장 String *은 String이됩니다. 따라서 이것을 String의 맵 키로 사용할 수 있습니다. 파생 할 수 없다면 String의 기능을 확장하는 클래스를 작성할 수 없습니다 (composition 사용). 그 클래스의 인스턴스를 문자열로 만드는 것을 막을뿐입니다. – jwg

관련 문제