그러나 이 될 수도 있다는 것은 상당히 헷갈리게 묻는 질문에 대해 jave 뉴비 판매업체에서 멍청한 것 같아요.
좋은 예 (Java) 이 정말 감사합니다.
즉 일단 구성자를 불변 객체에 대한 실행, t # 39 를 변경할 수 있는 can& 인스턴스입니다 완료되었습니다.
이것은 객체에 대한 참조가 로 유용하다 무슨뜻이냐믄 전달할 수 있습니다, 그 내용을 변경할 수 있는 다른 사람이 주위에 걱정 없이 진행되고 있다. 특히 잠금식 문제를 다룰 때, 동시에 수행할 수 없는 객체에는 변경되지 않는
예:
class Foo
{
private final String myvar;
public Foo(final String initialValue)
{
this.myvar = initialValue;
}
public String getValue()
{
return this.myvar;
}
}
단, '클래스' 이매진 'Foo 경우 비슷한 스트라이베이더' 보다는 'String' 한 수 있는 것을 볼 수 있습니다 '멤버로 요청자에게 제바루이 변경하십시오 스트라이베이더 의' 속성 ' ()' 'Foo' 인스턴스입니다 수 있을 것 "이라고 밝혔다.
또한 서로 다른 종류의 불역성 하고 바랄 얻을 수도 있습니다. 에릭 리퍼트 쓴 《 블로그 글 우리 섹스한거요. 하지만 그 인터페이스는 기본적으로 behind the scenes 실제 변경 가능 보면안돼 스테이드 불변 객체를 할 수 있습니다 (즉, can& # 39, 스레드 간 안전하게 공유할 수 없다).
불변 객체는 객체를 creditbank. 내부 필드 (또는 최소한 필드용 영향을 미치는 모든 내부, 외부 비헤이비어를) 변경할 수 없습니다.
불변 문장열 많은 이점을 얻을 수 있습니다.
String substring = fullstring.substring(x,y);
이 방법은 아마 기본 C 를 substring () 이 같은 일이.
// Assume string is stored like this:
struct String { char* characters; unsigned int length; };
// Passing pointers because Java is pass-by-reference
struct String* substring(struct String* in, unsigned int begin, unsigned int end)
{
struct String* out = malloc(sizeof(struct String));
out->characters = in->characters + begin;
out->length = end - begin;
return out;
}
참고로 할 경우 어떤 문자를 복사됩니다! * String 객체에 pokemonsilver. 변경 가능 (나중에 문자를 변경할 수 있다) 을 할 때와 그렇지 않을 경우 모든 문자를 문자열의 복제본에 변경되는지 문자를 다른 문자열이어야 약간만이라도 반영돼 있다.
Concurrency: 불변 객체가 유효함, 이 경우 내부 구조를 항상 유효함. # 39 의 잘못된 상태로 만들 수 있는 가능성은 전혀 다른 스래드입니다 there& 내의 객체에는. 불변 객체는 업그레이드됨 스레드할 안전하다구요 , *.
쓰레기요 collection:* It& # 39 에 대한 불변 객체에 대한 논리적 决策 쓰레기요 모음기 훨씬 쉽게 만들 수 있습니다.
그러나 불역성 수 또한 적지 않다.
foo = foo.substring(0,4) + "a" + foo.substring(5); // foo is a String
bar.replace(4,5,"a"); // bar is a StringBuilder
두 노선 모두 4 문자 문자로 " 재장착합니다 a".; 자세한 것은 # 39 의 두 번째 코드 부분을 판독값, it& 가속화합니다. Foo 의 기본 코드 살펴보면서 해야 할 것입니다. 이 때문에, 지금은 이미 # 39 의 경우 쉽게 서브문자열을 there& http://support. 공간이 될 수 있는 5 개, 뭔가 다른 문자 참조 foo 전날에약혼자에게 can& # 39, t, 그냥 변경하십시오. 복사합니다를 합니다 전체 문자열 (물론 이 중 일부 기능은 추상화 salesforce. 총괄하였습니다 현실에서 기본 캜, 하지만 요점이지 슬라이드에서는 얻을 수 있는 코드를 표시하십시오 실행됨을 한 곳에 모두).
struct String* concatenate(struct String* first, struct String* second)
{
struct String* new = malloc(sizeof(struct String));
new->length = first->length + second->length;
new->characters = malloc(new->length);
int i;
for(i = 0; i < first->length; i++)
new->characters[i] = first->characters[i];
for(; i - first->length < second->length; i++)
new->characters[i] = second->characters[i - first->length];
return new;
}
// The code that executes
struct String* astring;
char a = 'a';
astring->characters = &a;
astring->length = 1;
foo = concatenate(concatenate(slice(foo,0,4),astring),slice(foo,5,foo->length));
단, 두 연결 문자열을 통해 얻을 수 있다! 라는 전체 루프 있다는 것을 의미합니다. 이 코드는 C '비교' 표시줄에는 작업:
bar->characters[4] = 'a';
변경 가능 구체화하십시오 작업은 확실히 훨씬 빠릅니다.
// This will have awful performance if you don't use mutable strings
String join(String[] strings, String separator)
{
StringBuilder mutable;
boolean first = true;
for(int i = 0; i < strings.length; i++)
{
if(!first) first = false;
else mutable.append(separator);
mutable.append(strings[i]);
}
return mutable.toString();
}
이후 객체에는 변경 가능 '' 로컬 참조입니다 전날에약혼자에게 don& # 39 동시성 (하나만 판매업체에서 스레드할 닿는 it), 안전 걱정할 필요 없다. # 39, t, 이는 단지 및 때문에 다른 곳에 referenced isn& 할당할지 stack 있기 때문에 이 작업이 끝나는 대로 할당 해제된 함수 호출 (rec.601 don& # 39, 쓰레기 수집을 걱정할 필요는 없다). 및 성능 및 불역성 가변성 의 장점을 모두 모두 사용할 수 있습니다.
실제로 사용할 수 없는 경우 문자열이어야 위키백과 정의마다 제안됩니다 명이다.
그래서 아마도 정의할 수 있다 할 수 없는 엄청난 객체여야 변했다.
불변 객체는 경우 상태 변화를 만든 후 아무도 그것을 볼 수 있지만 여전히 객체에는 (될필요는 반사) 은 불변?
불변 객체는 객체를 can& # 39, 프로그래밍 방식으로 변경할 수 없다. # 39, re 특히 they& 멀티스레디드 환경 또는 기타 좋은 환경에서 사용할 수 있다 (변형) 두 개 이상의 프로세스가 객체에 의 값을 변경할 수 있습니다.
그러나 실제로는 불변 객체가 아닌 단순히 구체화합니다 스트라이베이더 불신하니 변경 가능 일반 jave 구체화하십시오 변경 불가 (즉 한 번 it& # 39 의 만들어진 기본 문자열 객체를 변경하지 않고 변경할 수 없습니다.)
예를 들어, s (i have a 클래스 let& # 39 라고 말하고 있는 콜로레스트링 문자열으로 가치와 문자열으로 색상:
public class ColoredString {
private String color;
private String string;
public ColoredString(String color, String string) {
this.color = color;
this.string = string;
}
public String getColor() { return this.color; }
public String getString() { return this.string; }
public void setColor(String newColor) {
this.color = newColor;
}
}
이 예에서 콜로레스트링 변경할 수 있다고 한다 (변형) 의 주요 변경 가능 한 수 있기 때문에 새로운 만들지 않고 특성는 콜로레스트링 구분된다. 예를 들어, 이 나쁜 이유는 말할 수 있는 여러 스래드입니다 디스크입니다. diskid let& # 39 의 GUI 응용 데이터를 사용하는 콜로레스트링스 인쇄하려면 창을 닫습니다. 있으면 있는 대로 콜로레스트링 인스턴스입니다 창조되었으되
new ColoredString("Blue", "This is a blue string!");
그럼 항상 Blue" 죽이려하겠어요 작성되지는 문자열을 ";). 그러나 이 경우 다른 스레드할 잡을라는데 아홀트 인스턴스입니다 하며
blueString.setColor("Red");
갑자기, 아마 이제 " Red", 예기치 않게 됩니다. 한 때 문자열이어야 그들이성년에 " Blue"; 1. 이 때문에 불변 객체는 객체의 반군지역 때 거의 항상 선호하는 경우가 있다. 꼭 필요한 경우, 그러면 지키고 있는 경우 변경 가능 객체는 일반적으로 사용자의 특정 필드 밖으로 오브제 통해서만 반군지역 복제본에 제어입니다.
요약, Java, 자바드란g. 스트레이 백업이었습니다 불변객체 (, # 39 의 창조하 it& 변경할 수 없는 한 정보기술 (it) 과 자바드란g. 스트레이베이더 않고 바뀔 수 있기 때문에 변경 가능 객체에는 는 새 인스턴스를 만듭니다.
이전 string" 구체화하십시오 s1 = ";;
//s1 variable, refers to string in memory
reference | MEMORY |
variables | |
[s1] --------------->| "Old String" |
문자열이어야 s1, s2 =
//s2 refers to same string as s1
| |
[s1] --------------->| "Old String" |
[s2] ------------------------^
s1 = ", 새로운 String";
//s1 deletes reference to old string and points to the newly created one
[s1] -----|--------->| "New String" |
| | |
|~~~~~~~~~X| "Old String" |
[s2] ------------------------^
>. # 39, & # 39 의 원래 문자열을 memory&. # 39 didn& 있지만, t change >. 이 용어는 참조입니다 가변으로 변경되어 새로운 구체화하십시오. >. 만일 하나님이 없다, s2, 이전 String" " didn& # 39;; 하지만 여전히 기억에 수 >. # 39, ll we& 액세스하도록 수 없습니다.
" immutable"; 고말은 값을 변경할 수 없습니다. String 클래스에 인스턴스입니다 경우 모든 방법을 만들 수 있는 것 같다, 실제로 다른 값을 전화하시기 수정하십시오 구체화하십시오.
String foo = "Hello";
foo.substring(3);
<-- foo here still has the same value "Hello"
변경 사항을 어떻게해야합니다 유지하기 위해 이 같은 일이 foo = 포오수스트링 (3).
재미있는 작업할 때 컬렉션을 불변 vs 변경 가능 할 수 있다. 무슨 일이 일어날지 생각해 사용할 경우 변경 가능 로케이터로 키에 대해 그리곤요 매핑해야 값을 변경하십시오 (팁: 생각해 보라 '는' 와 '하시코드').
하지만 조금 이해하기 위해서는 어떤 불변 객체가 될 수 있다고 말 것을 고려해보십시오 다음 예제에서는 새로운 자바 API 에서 8 날짜 및 시간 (제바스티메). 이미 알고 계신 것처럼 모든 개체는 다음 예와 그러하매 Java 에서 8 은 불변
LocalDate date = LocalDate.of(2014, 3, 18);
date.plusYears(2);
System.out.println(date);
출력:
18-03-2014 >.
이 때문에 같은 해 인쇄합니다 처음 날짜를 플루시어스 (2) '' 새 객체를 변경하지 않고 그 때문에 여전히 이전 날짜가 되돌려줍니다 it& # 39 의 불변 객체를. 생성된 날짜 가변으로 그래도말야 에셋을 가리키는 정보기술 (it) 과 수정할 수 없습니다.
그래서, 그 코드 예제 및 사용 할 수 있는 '콜' 에서 새 객체를 캡처하기 인스턴스화되지 반환함 플루시어스.
LocalDate date = LocalDate.of(2014, 3, 18);
LocalDate dateAfterTwoYears = date.plusYears(2);
18-03-2014, > 다테스토스트링 ().
18-03-2016, > 다테파테르보이어스스토스트링 ().
I really like the 엑스프레이나시옹 에서 [스테요프 Sun Certified 프로그래머용 for Java 5 검토인 안내선] [1]. >. Jvm 의 메모리 영역에서 특별 세트 등을 효율적으로 하기 위해 더 많은 메모리를 jave 라는 문자열을 상수입니다 pool." "; 만나면 컴파일러에서 동일한 문자열 풀 경우 이미 ipv6-literal. 문자열으로 검사합니다 볼 수 있습니다. 일치하는 항목이 있으면 참조입니다 새로운 ipv6-literal. 는 기존의 문자열을 String ipv6-literal. 전달됩니까 어떠한 새로운 개체가 만들어집니다. >.
[1]: http://www.amazon.com/certified-programmer-310-055-certification-guides/dp/ pd_bbs_sr_2? 키드 = 0072253606, 1226363595, s = books& utf8& /ref = ie = sr = 8-2 &.
불변 객체가 변경일 만든 후 상태를 가질 수 없습니다.
불변 객체를 사용할 수 있습니다 다음 세 가지 이유가 있을 때, 이 모든 것을 코드에 버그가 소개하십시오 수를 줄이는 데 도움이 될 수 있습니다.
또한 다른 최적화 만들 수 있는 코드가 알잖나 객체의 상태를 변경할 수 없기 때문에, 예를 들어, - - 캐싱과는 계산된 해시라고 그것은꿈의 최적화 거의 없는 것이 너무 재미있다.
String s1="Hi";
String s2=s1;
s1="Bye";
System.out.println(s2); //Hi (if String was mutable output would be: Bye)
System.out.println(s1); //Bye
s1 ':' = " Hi"; s1 ',' 객체를 생성한 " Hi". 값을 항목이없습니다.
's2 = s1': s1 s2 '로 만든' 는 객체에 대한 참조가 객체에는.
s1 ':' = " Bye"; s1 '이전', 't change 값을 # 39 의 object& # 39 doesn& s1' 에 있기 때문에 문자열 유형 및 구체화하십시오 유형은 불변 유형, 대신 새로운 것을 만들 수 있는 문자열 객체를 컴파일러와의 " Bye"; 가치 '와' s1 referenced 예정이다. 여기서 우리는, 그 결과 값이 될 때 ',' s2 인쇄하십시오 " Hi". bye" " 없습니다;; s1, s2 '때문에' 이전 '' 객체에는 " Hi" referenced 있는 것이다. 값.
불변 앨리어스가 변경 또는 불가능한 것은 아니다. # 39 는 데이터 또는 상태로 만든 후 객체인지 문자열이어야 can& 변경할 수 없다.
예를 들어, 고려해보십시오 벨로
class Testimmutablestring{
public static void main(String args[]){
String s="Future";
s.concat(" World");//concat() method appends the string at the end
System.out.println(s);//will print Future because strings are immutable objects
}
}
이에 따라, 향후 World", 새로 만든 객체를 " 구성도를 볼 수 있습니다. &Quot Future" 변경할 수 없기 때문에, 문자열이어야 변경할 수는 없습니다. ','. 여전히 " Future" 's',,) 는 다음과 같은 뜻이 있다. &Quot 연락해야 할 경우, 향후 World"
String s="Future";
s=s.concat(" World");
System.out.println(s);//print Future World
>. 같도다라고 jave /dev/raw/raw1 总监和首席信息官完全了解 구체화하십시오 ipv6-literal. 예를 들어, 모든 변수 () 은 1, 5 개의 참조입니다 " 객체에는 future" 객체의 변수 값을 변경하고, .if 원-부트 참조입니다 얻게된다면 영향을 받는 모든 참조입니다 com/go/4e6b330a_kr. 그래서 문자열이어야 불변 객체는 자바 가상 머신 (jvm) 에.
불변 객체를 고려되는지 상태로 경우 후에는 변경할 수 있다. 불변 객체에 대한 의존도를 극대화됩니다 사운드를 만들기 위한 전략을 간단하고 신뢰할 수 있는 코드) 로 널리 사용되고 있다.
불변 객체는 애플리케이션을 동시에 특히 유용하다. 없으므로 상태 변경 될 수 없는 손상됨 스레드할 의해 목격됐다고 인터퍼런스 또는 일관성 없는 상태입니다.
프로그래머는 자주 사용하는 것에 대해 우려하고 있기 때문에 불변 객체는 객체의 업데이트하던 로케이터로 새로 만드는 데 드는 비용을 파일배치. 객체 생성 미치는 경우가 있으며, 일부 효율성을 과다하게 책정한 것으로 오프셋됩니다 아니했어야 불변 객체를. 여기에는 인해 줄어든 오버헤드에 가비지 수집, 그리고 코드 제거라고도 객체에는 손상을 보호하는 데 필요한 변경 가능.
그 다음 하위 클래스 인스턴스는 시행하십시오 불변 클래스를 사용하여 변경 가능 및 파생시킵니다 인스턴스들도 탈퇴했다. 이렇게 하면, 그들은 일반적인 규칙을 열거하십시오 이러한 형태의 변환 및 제시하십시오 다음과 같은 장점이 불변 객체를.
불변 객체는 하나의 생성한 후에는 수정할 수 없습니다. 리터럴 문자열 (string) 가 대표적인 예다.
(D) 는 프로그래밍 언어, 즉, immutability" " 개념을 점점 인기를 얻고 있다. " 통해 invariant"; 키워드. 이걸 닥터 dobb& # 39 에 관한 기사를 정보기술 (it) - [http://dobbscodetalk.com/index.php? =, = invariant-strings.html& com_myblog& 표시 옵션, itemid = 29] [1]. 그런 문제에 대해 설명합니다.
[1]: http://dobbscodetalk.com/index.php =, =, = 29 Itemid Invariant-Strings.html& 보기 옵션을 com_myblog&?