EnumSet
Enum'lar üzerinde hızlı küme işlemleri
EnumSet, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
EnumSet Nedir?
EnumSet, yalnızca numaralandırma türleri için özelleştirilmiş bir Set uygulamasıdır.
İçeride bir bit vektörüdür: her sabit bir bite karşılık gelir. Bu nedenle numaralandırma türlerinden oluşan bir HashSet'e kıyasla son derece hızlı ve bellek açısından verimlidir.
import java.util.EnumSet;
import java.util.Set;
public class Main {
enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
public static void main(String[] args) {
Set<Day> weekend = EnumSet.of(Day.SAT, Day.SUN);
System.out.println(weekend);
}
}of ile Oluşturma
EnumSet.of(...) fabrika yöntemi, listelenen sabitlerden bir küme oluşturur. Birden beş elemana kadar aşırı yüklenmiş sürümlerin yanı sıra değişken sayıda bağımsız değişken alan bir sürüm de vardır.
import java.util.EnumSet;
public class Main {
enum Perm { READ, WRITE, EXECUTE }
public static void main(String[] args) {
EnumSet<Perm> perms = EnumSet.of(Perm.READ, Perm.WRITE);
System.out.println(perms);
}
}allOf ve noneOf
İki fabrika yöntemi daha vardır:
allOf(Type.class)tüm sabitleri içeren bir küme oluşturur.noneOf(Type.class)doldurulmaya hazır boş bir küme oluşturur.
import java.util.EnumSet;
public class Main {
enum Color { RED, GREEN, BLUE }
public static void main(String[] args) {
EnumSet<Color> all = EnumSet.allOf(Color.class);
EnumSet<Color> none = EnumSet.noneOf(Color.class);
none.add(Color.RED);
System.out.println("all: " + all);
System.out.println("built: " + none);
}
}Bitişik Sabitler için range
EnumSet.range(from, to), bildirim sırasındaki iki uç sabit arasındaki tüm sabitleri uçlar da dahil olacak şekilde içerir.
import java.util.EnumSet;
public class Main {
enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
public static void main(String[] args) {
EnumSet<Day> workdays = EnumSet.range(Day.MON, Day.FRI);
System.out.println(workdays);
}
}complementOf
EnumSet.complementOf(set), verilen kümede bulunmayan tüm sabitlerden oluşan bir küme döndürür.
Bu, bir seçimi tersine çevirmenin hızlı bir yoludur.
import java.util.EnumSet;
public class Main {
enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
public static void main(String[] args) {
EnumSet<Day> work = EnumSet.range(Day.MON, Day.FRI);
EnumSet<Day> rest = EnumSet.complementOf(work);
System.out.println(rest);
}
}Küme İşlemleri
EnumSet gerçek bir Set olduğundan, birleşim, kesişim ve fark işlemlerini addAll, retainAll ve removeAll aracılığıyla gerçekleştirebilirsiniz.
Bunlar arka planda bit düzeyinde işlemler olarak çalışır ve çok hızlıdır.
import java.util.EnumSet;
public class Main {
enum Tag { A, B, C, D }
public static void main(String[] args) {
EnumSet<Tag> x = EnumSet.of(Tag.A, Tag.B, Tag.C);
EnumSet<Tag> y = EnumSet.of(Tag.B, Tag.C, Tag.D);
EnumSet<Tag> inter = EnumSet.copyOf(x);
inter.retainAll(y);
System.out.println("intersection: " + inter);
}
}Üyelik Denetimleri
contains tek bir bit denetimi yapar; bu nedenle sabit zamanda ve çok hızlı çalışır.
import java.util.EnumSet;
public class Main {
enum Feature { DARK_MODE, BETA, ANALYTICS }
public static void main(String[] args) {
EnumSet<Feature> enabled = EnumSet.of(Feature.DARK_MODE, Feature.BETA);
System.out.println(enabled.contains(Feature.BETA));
System.out.println(enabled.contains(Feature.ANALYTICS));
}
}Bayrakların Yerine EnumSet
EnumSet'ten önce programcılar int bit bayrakları gibi READ | WRITE ifadeleri kullanırdı. EnumSet, bunların yerini tür güvenliği ve okunabilirlikle doldurur.
Hataya açık elle maskeleme işlemleri olmadan bit alanlarının performansını elde edersiniz.
import java.util.EnumSet;
import java.util.Set;
public class Main {
enum Style { BOLD, ITALIC, UNDERLINE }
static void render(Set<Style> styles) {
System.out.println("Applying: " + styles);
}
public static void main(String[] args) {
render(EnumSet.of(Style.BOLD, Style.UNDERLINE));
}
}Bildirim Sırasına Göre Yineleme
EnumSet, sabitlerin doğal sırasına göre, yani bildirim sırasına göre yinelenir.
Bu, HashSet'in aksine öngörülebilir ve kararlı bir yineleme sağlar.
import java.util.EnumSet;
public class Main {
enum Phase { ALPHA, BETA, RC, GA }
public static void main(String[] args) {
EnumSet<Phase> set = EnumSet.of(Phase.GA, Phase.ALPHA, Phase.RC);
for (Phase p : set) System.out.println(p);
}
}copyOf ile Koruyucu Kopyalar
EnumSet.copyOf(collection), herhangi bir numaralandırma türü değerleri koleksiyonundan bir EnumSet oluşturur. Güvenli bir kopya oluşturmak veya bir Listeyi dönüştürmek için kullanın.
import java.util.EnumSet;
import java.util.List;
public class Main {
enum Role { ADMIN, EDITOR, VIEWER }
public static void main(String[] args) {
List<Role> source = List.of(Role.EDITOR, Role.VIEWER);
EnumSet<Role> roles = EnumSet.copyOf(source);
System.out.println(roles);
}
}Neden Hızlıdır
64 veya daha az sabit içeren numaralandırma türlerinde EnumSet, bit vektörü olarak tek bir long kullanır. Her işlem bir veya iki makine komutundan oluşur.
Numaralandırma türü kümeleri için her zaman HashSet<MyEnum> yerine EnumSet kullanmayı tercih edin.
import java.util.EnumSet;
public class Main {
enum Bit { B0, B1, B2, B3 }
public static void main(String[] args) {
EnumSet<Bit> s = EnumSet.of(Bit.B0, Bit.B2);
// contains is a single bit-and under the hood
System.out.println(s.contains(Bit.B2));
}
}Hızlı Kontrol
EnumSet bilginizi sınayın.
Özet
EnumSet'i öğrendiniz:
- Numaralandırma türleri için çok hızlı ve küçük bir bit vektörü
Setuygulamasıdır. - Fabrika yöntemleri:
of,allOf,noneOf,range,complementOf,copyOf. - Bildirim sırasına göre yinelenir.
- int bit bayraklarının tür güvenli alternatifidir.
Sırada eşleşen Map türü olan EnumMap var.
import java.util.EnumSet;
public class Main {
enum X { A, B }
public static void main(String[] args) {
System.out.println("EnumSet recap: " + EnumSet.allOf(X.class));
}
}Sıkça Sorulan Sorular
“EnumSet” dersi ücretsiz mi?
Evet — “EnumSet” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“EnumSet” dersinde ne öğreneceğim?
Enum'lar üzerinde hızlı küme işlemleri Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“EnumSet” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.