아이템 24. 멤버 클래스는 되도록 static으로 만들라 #48
Answered
by
JoisFe
Irisation23
asked this question in
3. 과제
-
Table of contents generated with markdown-toc1. 중첩 클래스(nested class) 정의 ✨
class Outer {
// Some Fields...
class Inner {
// Some Fields...
}
} 2. 중첩 클래스 종류 📱2-1. 정적 멤버 클래스 - static Class
class RecommendService {
public String getRecommendId(String new_id) {
String id = new IdMaker(new_id)
.replaceToLowerCase()
.replacePattern()
.replaceGreaterThan16()
.getId();
return id;
}
private static class IdMaker {
private String id;
IdMaker(String id) {
this.id = id;
}
private IdMaker replaceToLowerCase(){
id = id.toLowerCase();
return this;
}
private IdMaker replacePattern(){
id = id.replaceAll("[^a-z0-9]", "");
return this;
}
private IdMaker replaceGreaterThan16(){
if (id.length() > 15) {
id = id.substring(0, 15);
}
return this;
}
private String getId(){
return id;
}
}
} 책 예제 코드 보기public class Calculator {
public enum Operation { // 열거 타입도 암시적 static 이다.
PLUS, MINUS, MULTIPLE, SUBTRACT
}
}
2-2. 비정적 멤버 클래스 - non static Class
코드 보기class Foo {
void bar() {
}
class NestedFoo {
void bar() {
Foo.this.bar();
}
}
}
class Main {
public static void main(String[] args) {
NestedFoo nestedFoo = new Foo().new NestedFoo();
nestedFoo.bar();
}
}
HashMap에 사용중인 비정적 멤버 클래스 코드 보기public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable {
...
public Set<K> keySet() {
Set<K> ks = keySet;
if (ks == null) {
ks = new KeySet();
keySet = ks;
}
return ks;
}
final class KeySet extends AbstractSet<K> {
public final int size() { return size; }
public final void clear() { HashMap.this.clear(); }
public final Iterator<K> iterator() { return new KeyIterator(); }
public final boolean contains(Object o) { return containsKey(o); }
public final boolean remove(Object key) {
return removeNode(hash(key), key, null, false, true) != null;
}
public final Spliterator<K> spliterator() {
return new KeySpliterator<>(HashMap.this, 0, -1, 0, 0);
}
public final void forEach(Consumer<? super K> action) {
Node<K,V>[] tab;
if (action == null)
throw new NullPointerException();
if (size > 0 && (tab = table) != null) {
int mc = modCount;
for (Node<K,V> e : tab) {
for (; e != null; e = e.next)
action.accept(e.key);
}
if (modCount != mc)
throw new ConcurrentModificationException();
}
}
}
} 다른 타입의 인스턴스를 리턴한다라는 말을 좀 더 풀어 보자면
AbstractSet의 구현 코드package effective;
import java.util.AbstractSet;
import java.util.Iterator;
public class MySet<E> extends AbstractSet<E> {
@Override
public Iterator<E> iterator() {
return new MyIterator();
}
@Override
public int size() {
return 0;
}
private class MyIterator implements Iterator<E> {
@Override
public boolean hasNext() {
return false;
}
@Override
public E next() {
return null;
}
}
}
2-3. 익명 클래스
List<Integer> list = Arrays.asList(10, 5, 6, 7);
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1, o2);
}
});
System.out.println(list); (Java 8 이후 람다 등장) Collections.sort(list, (o1, o2) -> Integer.compare(o1, o2)); 2-4. 지역 클래스
지역 클래스 예시public class TestThread {
public static void main(String[] args) {
Thread goodNightThread = new Thread(() -> {
try {
for (int i = 0; i <10; i++){
Thread.sleep(1000);
System.out.println("양 " + i + "마리...");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
goodNightThread.start();
}
}
3. 중첩 클래스의 사용 당위성 📚
4. 회고 🧹
|
Beta Was this translation helpful? Give feedback.
Answered by
JoisFe
Jan 9, 2023
Replies: 1 comment 2 replies
-
#47 comment에 남겨놓았듯 단순히 멤버클래스 하나 만드는데도 메모리 낭비를 하지 않는지, 숨은 외부 참조를 가져 가비지 컬렉터가 활동하지 못하게 하는지 고민해야할 것이 많군요.. 아 그리고 익명 클래스 부분 또한 유익했습니다.
람다식은 메서드를 하나의 식으로 표현하는 선언적 프로그래밍 방법
|
Beta Was this translation helpful? Give feedback.
2 replies
Answer selected by
Irisation23
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
#47 comment에 남겨놓았듯 단순히 멤버클래스 하나 만드는데도 메모리 낭비를 하지 않는지, 숨은 외부 참조를 가져 가비지 컬렉터가 활동하지 못하게 하는지 고민해야할 것이 많군요..
아 그리고 익명 클래스 부분 또한 유익했습니다.
자바 8 버전 이후 추상 메서드 1개 있는 인터페이스 즉 함수형 인터페이스를 구현하기 위해 람다를 이용하여 코드를 현저히 줄일 수 있다는 점이 좋았습니다.
람다식은 메서드를 하나의 식으로 표현하는 선언적 프로그래밍 방법