AskMePlz / EffectiveJava

이펙티브자바를 공부합니다.
4 stars 4 forks source link

아이템 05. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 #5

Closed JamieShin0201 closed 2 years ago

dev-jaekkim commented 2 years ago

p28-29 SpellChecker 가 여러 사전을 사용할 수 있도록 만들어보자. 간단히 dictionary 필드에서 final 한정자를 제거하고 다른 사전으로 교체하는 메서드를 추가할 수 있지만, 아쉽게도 이 방식은 어색하고 오류를 내기 쉬우며 멀티스레드 환경에서는 쓸 수 없다.

제가 멀티 쓰레드 환경을 접해본적이 없어서, 혹시 복잡하다면 간단하게라도 왜 그런건지 이유가 궁금합니다.!

dev-jaekkim commented 2 years ago

p30 Mosaic create(Supplier<? extends Tile> tileFactory) {...}

해당 코드 조각의 의미가 헷갈립니다. 이 코드에 의하면, Supplier 가 Tile이 상속받고 있는 어떤 객체든지 tileFactory라는 객체로 만들어서 공급한 걸 Mosaic가 메서드를 생성한다는 뜻일까요?

JamieShin0201 commented 2 years ago

p28-29 SpellChecker 가 여러 사전을 사용할 수 있도록 만들어보자. 간단히 dictionary 필드에서 final 한정자를 제거하고 다른 사전으로 교체하는 메서드를 추가할 수 있지만, 아쉽게도 이 방식은 어색하고 오류를 내기 쉬우며 멀티스레드 환경에서는 쓸 수 없다.

제가 멀티 쓰레드 환경을 접해본적이 없어서, 혹시 복잡하다면 간단하게라도 왜 그런건지 이유가 궁금합니다.!

먼저 인스턴스 변수는 JVM 메모리 힙 영역에 저장되며 공유될 수 있습니다. 여러 스레드에서 SpellChecker 객체에 Korean Dictionary를 담아 사용중일 때, 어떤 스레드가 Dictionary를 English Dictionary 로 바꾼다면 같은 SpellChecker 객체를 사용하는 모든 스레드에 영향이 갈 수 있습니다.

자바에서의 동시성 이슈 관련 참고 블로그: https://deveric.tistory.com/104

JamieShin0201 commented 2 years ago

p30 Mosaic create(Supplier<? extends Tile> tileFactory) {...}

해당 코드 조각의 의미가 헷갈립니다. 이 코드에 의하면, Supplier 가 Tile이 상속받고 있는 어떤 객체든지 tileFactory라는 객체로 만들어서 공급한 걸 Mosaic가 메서드를 생성한다는 뜻일까요?

위 메서드는 타일을 이용해 모자이크를 만드는 메서드에요. 호출 할떄는 아래와 같이 심플 타일을 제공하는 Supplier를 람다로 구현해 모자이크를 만들 수 있어요.

Mosaic mosaic = object.create(() -> new SimpleTile())
JamieShin0201 commented 2 years ago

답변이 되었는지 모르겠어요! 이해가 안되는 부분이 있으시면 알려주세요~

dev-jaekkim commented 2 years ago

p30 Mosaic create(Supplier<? extends Tile> tileFactory) {...} 해당 코드 조각의 의미가 헷갈립니다. 이 코드에 의하면, Supplier 가 Tile이 상속받고 있는 어떤 객체든지 tileFactory라는 객체로 만들어서 공급한 걸 Mosaic가 메서드를 생성한다는 뜻일까요?

위 메서드는 타일을 이용해 모자이크를 만드는 메서드에요. 호출 할떄는 아래와 같이 심플 타일을 제공하는 Supplier를 람다로 구현해 모자이크를 만들 수 있어요.

Mosaic mosaic = object.create(() -> new SimpleTile())

설명 감사합니다. 제가 아직 의존성 주입에 대한 개념이 확실하지 않아서 그런지 아직 조금 헷갈려서 질문드립니다. 예시로 설명해주신 코드에서 왜 object.create를 사용하여 mosaic 객체를 만드는건지 이해가 안 갑니다 ㅠㅠ 그냥

Mosiac mosaic = new Mosiac();

를 하면 될거 같은데 왜 이 방법으로 안 하는걸까요? Mosiac 객체를 하나로 사용하기 위해서, 같은 주소값을 참조하는 객체를 생성하기 위함일까요..?

peacebestill0314 commented 2 years ago

생성자에 의존객체 주입하는 케이스 말고도 정적 팩토리 나 빌더 객체에 의존 객체를 주입하는 예제 코드가 궁금합니다!

JamieShin0201 commented 2 years ago

생성자에 의존객체 주입하는 케이스 말고도 정적 팩토리 나 빌더 객체에 의존 객체를 주입하는 예제 코드가 궁금합니다!

Mosaic mosaic = new Mosaic(new Tile());
Mosaic mosaic2 = Mosaic.create(() -> new Tile());
Mosaic mosaic3 = Mosaic.builder()
        .tile(new Tile())
        .build();

위와 같이 사용할 수 있을 것 같아요~!

JamieShin0201 commented 2 years ago

p30 Mosaic create(Supplier<? extends Tile> tileFactory) {...} 해당 코드 조각의 의미가 헷갈립니다. 이 코드에 의하면, Supplier 가 Tile이 상속받고 있는 어떤 객체든지 tileFactory라는 객체로 만들어서 공급한 걸 Mosaic가 메서드를 생성한다는 뜻일까요?

위 메서드는 타일을 이용해 모자이크를 만드는 메서드에요. 호출 할떄는 아래와 같이 심플 타일을 제공하는 Supplier를 람다로 구현해 모자이크를 만들 수 있어요.

Mosaic mosaic = object.create(() -> new SimpleTile())

설명 감사합니다. 제가 아직 의존성 주입에 대한 개념이 확실하지 않아서 그런지 아직 조금 헷갈려서 질문드립니다. 예시로 설명해주신 코드에서 왜 object.create를 사용하여 mosaic 객체를 만드는건지 이해가 안 갑니다 ㅠㅠ 그냥

Mosiac mosaic = new Mosiac();

를 하면 될거 같은데 왜 이 방법으로 안 하는걸까요? Mosiac 객체를 하나로 사용하기 위해서, 같은 주소값을 참조하는 객체를 생성하기 위함일까요..?

써주신 것 처럼 생성자를 이용해 Mosiac을 바로 만들어도 됩니다. 저자가 여러 방법을 소개하는 거 같아요!