program tip

EnumSet은 실제로 무엇을 의미합니까?

radiobox 2020. 11. 17. 07:58
반응형

EnumSet은 실제로 무엇을 의미합니까?


다음 예가 있습니다.

import java.util.EnumSet;
import java.util.Iterator;

public class SizeSet {

    public static void main(String[] args) {
        EnumSet largeSize = EnumSet.of(Size.XL,Size.XXL,Size.XXXL);
        for(Iterator it = largeSize.iterator();it.hasNext();){
            Size size = (Size)it.next();
            System.out.println(size);
        }
    }
}


enum Size {
  S, M, L, XL, XXL, XXXL;

}

이 코드에서 Enum이 크기의 Enum 유형을 생성한다는 것을 이해할 수 있습니다.

내 질문은 : largeSizeEnumSet 유형의 객체입니까? 그것은 정말로 무엇을 의미합니까? 나는 그것을 더 잘 이해하고 싶다.


변수의 유형은 선언에서 찾을 수 있습니다.

EnumSet largeSize

예, largeSize( largeSizes컬렉션이기 때문에 이름이 지정되어야 함 ) 유형 EnumSet입니다. 또한 생성되어야하므로 다음과 같이 선언해야합니다.

EnumSet<Size> largeSizes

의미하는 바 largeSizes는 유형 EnumSet입니다. EnumSetA는 Set다른 것보다 더 효율적인 방식으로, 특정의 열거 형의 열거 인스턴스를 포함하는 Set(같은 구현 HashSet, TreeSet등). 이 무엇인지 알아 보려면 API를EnumSet 읽어보십시오 .


코드 단순화

EnumSet<Size> largeSize = EnumSet.of(Size.XXXL, Size.XXL, Size.XL, Size.L);
for(Size size: largeSize)
    System.out.print(size+" ");

largeSize는 Enum을 저장하도록 설계된 것을 제외하고는 일반 세트라는 것을 알 수 있습니다. 그게 어떻게 다릅니 까? 첫째, JVM은 모든 객체를 저장하는 대신 비트 맵을 사용할 수 있다는 것을 의미하는 세트의 가능한 모든 값을 알고 있습니다. 여기서 1은 항목이 있음을 의미하고 0은 그렇지 않음을 의미합니다. 이것은 또한 세트의 순서가 서수 값의 순서, 즉 정의 된 순서임을 의미합니다. 이것이 인쇄되는 이유입니다.

L XL XXL XXXL

더 자세히 알고 싶다면이 수업의 소스를 읽어 보시기 바랍니다.


단순 Enum은 한 번에 하나만 선택할 수있는 값 목록입니다 . 예를 들어, 크기는 주어진 천에 대해 S, M, L 등 중 하나만 될 수 있습니다. 대신 간단한 상수를 사용할 수 Enum있지만 이것은 가독성, 쉬운 유지 관리 및 엄격한 유형 검사의 장점이 있습니다.

EnumSet하나 개 이상의 가정 할 수있는 변수에 대한 필요가있을 때 사용되는 Enum동시에 값입니다. 예를 들어 화면에 쓰는 글꼴은 동시에 굵은 체기울임 체일 수 있습니다 . EnumSet사용자가 다양한 값을 추가하고 그 중 하나가 실제로 주어진 시간에 설정되어 있는지 여부를 테스트에 할 수 있습니다. 다른 프로그래밍 언어에서 Java를 사용하는 경우 일반적으로 플래그 라고하는 기능 입니다.

두 가지를 비교하십시오.

enum Size { S, M, L, XL, XXL, XXXL }
Size currentSize;
...
currentSize = Size.S;
...
if (currentSize == Size.S) ...

단일 Enum을 정의하고 할당 한 다음 확인 합니다.

enum FontStyle { Bold, Italic, Underline, Strikethrough }
EnumSet<FontStyle> currentStyle;
...
currentStyle = EnumSet.of(FontStyle.Bold, FontStyle.Italic);
...
if (currentStyle.contains(FontStyle.Italic)) ...

Enum동시에 두 개의 값을 정의하고 할당 한 다음 그 중 하나가 실제로 설정되었는지 여부를 확인합니다.


Joshua Bloch의 책 자체와 자신의 말에서 발췌 :

java.util 패키지는 단일 enum 유형에서 가져온 값 세트를 효율적으로 표현하기 위해 EnumSet 클래스를 제공합니다. 이 클래스는 Set 인터페이스를 구현하여 다른 Set 구현과 함께 얻을 수있는 모든 풍부함, 형식 안전성 및 상호 운용성을 제공합니다. 그러나 내부적으로 각 EnumSet은 비트 벡터로 표시됩니다. 기본 enum 유형에 64 개 이하의 요소가 있고 대부분의 경우 전체 EnumSet이 단일 long으로 표시되므로 성능이 비트 필드의 성능과 비슷합니다. removeAll 및 retainAll과 같은 대량 작업은 비트 필드에 대해 수동으로 수행하는 것처럼 비트 단위 산술을 사용하여 구현됩니다. 그러나 수동 비트 트위들 링의 추함과 오류 발생 가능성으로부터 보호됩니다. EnumSet은 당신을 위해 열심히 일합니다.

그래서 우리는 이렇게 할 수 있습니다.

public class SizeSet {

  public enum Size {S, M, L, XL, XXL, XXXL}

  public void applySize(Set<Size> sizes){}

}

그것을 호출하는 클라이언트 코드는 다음과 같은 일을 할 수 있습니다.

SizeSet largeSizeSet = new SizeSet();
largeSizeSet.applySize(EnumSet.of(Size.L, Size.XXL, Size.XXL));

applySize 방법이 필요합니다 Set<Size>보다는를 EnumSet<Size>. 클라이언트가 EnumSet을 메서드에 전달할 가능성이 매우 분명하고 가능성이 높지만 구체적인 구현보다는 인터페이스를 받아들이는 것이 좋습니다.


EnumSet은 특히 enum 유형 요소를 저장하고 빠르게 반복하는 데 사용됩니다. 예 :

for (Day d : EnumSet.range(Day.MONDAY, Day.FRIDAY))
        System.out.println(d);

위의 스 니펫은 월요일부터 금요일까지의 요일을 표시합니다.


Oracle 문서 에 따르면

열거 형 집합은 내부적으로 비트 벡터로 표시됩니다. 이 표현은 매우 간결하고 효율적입니다.

읽기 가능하고, 안전한 유형이며, 메모리 사용량이 적습니다. 무엇을 더 원하십니까?


다음 예가 주어집니다.

....
public static final String S = "s";
public static final String M = "m";
public static final String L = "l";
....

Set<String> sizeSet = new HashSet<String>();
sizeSet.add(S);
sizeSet.add(M);

그렇다면 위의 예에서 sizeSet은 무엇입니까?

EnumSet is nothing different from the above example, only that EnumSet is a special Set implementation that works with and optimized with enum types, that's all.


EnumSet largeSize

EnumSet largeSize is a set of Enum values which contains XL, XXL and XXXL.

Size 

Size is a class of Enum type with constant values S, M, L, XL, XXL, XXXL.

largeSize.iterator()

The Iterator for EnumSet is in natural order, the order in which the values of the enum were originally declared.

  • EnumSet class is a member of the Java Collections Framework & is not synchronized.
  • Its a high performance set implementation, they are much faster than HashSet.
  • All elements of each EnumSet instance must be elements of a single enum type.

To Know more read the api doc : http://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html


An EnumSet is a specialized Set collection to work with enum classes. It implements the Set interface and extends from AbstractSet:

enter image description here

When you plan to use an EnumSet youhave to take into consideration some points:

  1. It can contain only enum values and all the values have to belong to the same enum
  2. It doesn’t allow to add null values, throwing a NullPointerException in an attempt to do so
  3. It’s not thread-safe, so we need to synchronize it externally if required
  4. The elements are stored following the order in which they are declared in the enum
  5. It uses a fail-safe iterator that works on a copy, so it won’t throw a ConcurrentModificationException if the collection is modified when iterating over it

Now, the EnumSet largeSize part is a variable declaration so yes, it's of type EnumSet. Please notice that you can add the type of elements in the collection for better type safety: EnumSet<Size>

Check out this article to learn more about EnumSet.


As a rule of thumb, EnumSet should always be preferred over any other Set implementation when we are storing enum values.

Benefits from Using an EnumSet:

The methods in an EnumSet are implemented using arithmetic bitwise operations. These computations are very fast and therefore all the basic operations are executed in a constant time.

If we compare EnumSet with other Set implementations like HashSet, the first is usually faster because the values are stored in a predictable order and only one bit needs to be examined for each computation. Unlike HashSet, there's no need to compute the hashcode to find the right bucket.

Moreover, due to the nature of bit vectors, an EnumSet is very compact and efficient. Therefore, it uses less memory, with all the benefits that it brings.

sonarsource rules say:

When all the elements in a Set are values from the same enum, the Set can be replaced with an EnumSet, which can be much more efficient than other sets because the underlying data structure is a simple bitmap.

EnumMap

The source is here


It quickly turn any Enum elements into a set, EnumSet is yet another type of Set.

public enum Style { BOLD, ITALIC, UNDERLINE, STRIKETHROUGH }

EnumSet.of(Style.BOLD, Style.ITALIC);

참고URL : https://stackoverflow.com/questions/11825009/what-does-enumset-really-mean

반응형