매 거 유형 (2): 계승, 무 작위 선택, 인터페이스 조직 매 거 가 아 닌 실현
7550 단어 JAVA
우 리 는 모든 enum 이 자바. lang. Enum 류 에서 계승 되 었 다 는 것 을 이미 알 고 있다.자바 는 다 중 계승 을 지원 하지 않 기 때문에, 당신 의 enum 은 다른 종 류 를 계승 할 수 없습니다:
enum NotPossible extends Pet{ }
그러나 우리 가 새로운 enum 을 만 들 때 하나 이상 의 인 터 페 이 스 를 동시에 실현 할 수 있 습 니 다.
package enumerated.cartoons;
import java.util.Random;
import com.buba.util.Generator;
enum CartoonCharacter implements Generator {
SLAPPY, SPANKY, PUNCHY, SILLY, BOUNCY, NUTTY, BOB;
Random r = new Random();
@Override
public CartoonCharacter next() {
return values()[r.nextInt(values().length)];
}
}
public class EnumImplementation {
public static void printNext(Generator rg) {
System.out.print(rg.next() + ", ");
}
public static void main(String[] args) {
CartoonCharacter cc = CartoonCharacter.BOB;
for (int i = 0; i < 10; i++) {
printNext(cc);
}
}
}
이 결 과 는 좀 이상 하지만, 너 는 반드시 enum 실례 가 있어 야만 그 위의 방법 을 호출 할 수 있다.현재 Generator 인 자 를 받 아들 이 는 모든 방법 에서 printNext () 는 Cartoon Character 를 사용 할 수 있 습 니 다.
2. 무 작위 선택
Cartoon Character. next () 에서 보 듯 이 이 장의 많은 예 는 enum 인 스 턴 스 에서 무 작위 로 선택해 야 합 니 다.우 리 는 범 형 을 이용 하여 이 일 을 더욱 일반화 시 키 고 이 를 우리 의 도구 창고 에 넣 을 수 있다.
package com.buba.util;
import java.util.Random;
public class Enums {
private static Random r = new Random();
public static > T random(Class ec) {
return random(ec.getEnumConstants());
}
public static T random(T[] values) {
return values[r.nextInt(values.length)];
}
}
이상 한 문법 > T 는 enum 인 스 턴 스 임 을 나타 낸다.클 라 스 를 매개 변수 로 하면 클 라 스 대상 을 이용 하여 enum 인 스 턴 스 의 배열 을 얻 을 수 있 습 니 다.다시 불 러 오 면 random () 방법 은 T [] 를 매개 변수 로 사용 합 니 다. Enum 의 모든 동작 을 호출 하지 않 기 때문에 배열 에서 하나의 요 소 를 무 작위 로 선택 하면 됩 니 다.이렇게 해서 최종 반환 유형 은 바로 enum 의 유형 입 니 다.
다음은 random () 방법의 간단 한 예 입 니 다.
package enumerated;
import com.buba.util.Enums;
enum Activity {
SITTING, LYING, STANDING, HOPPING, RUNNING, DODGING, JUMPING, FALLING, FLYING
}
public class RandomTest {
public static void main(String[] args) {
for (int i = 0; i < 20; i++) {
System.out.print(Enums.random(Activity.class) + " ");
}
}
}
Enum 은 아주 짧 은 종류 이지 만 이 장 에서 중복 되 는 코드 를 많이 없 앨 수 있다 는 것 을 알 게 될 것 이다.반복 은 문 제 를 일 으 킬 수 있 기 때문에 중복 을 없 애 는 것 은 항상 유익 하 다.
3. 인터페이스 조직 매 거
enum 에서 자 류 를 물 려 받 지 못 하 는 것 은 때때로 우울 하 다.이러한 수 요 는 때때로 우리 가 원 enum 의 요 소 를 확장 하 기 를 원 하 는 데 서 비롯 되 고, 때로는 하위 클래스 를 사용 하여 하나의 enum 중의 요 소 를 그룹 으로 나 누 기 를 원 하기 때문이다.
인터페이스 내부 에서 이 인 터 페 이 스 를 실현 하 는 매 거 진 을 만 들 고 요 소 를 그룹 으로 나 누 면 매 거 진 요 소 를 조직 하 는 목적 을 달성 할 수 있 습 니 다.예 를 들 어 enum 으로 서로 다른 유형의 음식 을 표시 하고 싶다 고 가정 하 는 동시에 모든 enum 요소 가 Food 유형 을 유지 하 기 를 바란다.그러면 이렇게 실현 할 수 있다.
package enumerated.menu;
public interface Food {
enum Appetizer implements Food {
SALAD, SOUP, SPRING_ROLLS;
}
enum MainCourse implements Food {
LASAGNE, BURRITO, PAD_THAI, LENTILS, HUMMOUS, VINDALOO;
}
enum Dessert implements Food {
TIRAMISU, GELATO, BLACK_FOREST_CAKE, FRUIT, CREME_CARAMEL;
}
enum Coffee implements Food {
BLACK_COFFEE, DECAF_COFFEE, ESPRESSO, LATTE, CAPPUCCINO, TEA, HERB_TEA;
}
}
enum 의 경우 인 터 페 이 스 를 실현 하 는 것 이 하위 클래스 화 하 는 유일한 방법 이기 때문에 Food 에 포 함 된 모든 enum 은 Food 인 터 페 이 스 를 실현 했다.현재 다음 프로그램 에서 우 리 는 '모든 것 이 특정한 유형의 Food' 라 고 말 할 수 있다.
package enumerated.menu;
import enumerated.menu.Food.Appetizer;
import enumerated.menu.Food.Coffee;
import enumerated.menu.Food.Dessert;
import enumerated.menu.Food.MainCourse;
public class TypeOfFood {
public static void main(String[] args) {
Food food = Appetizer.SALAD;
food = MainCourse.LASAGNE;
food = Dessert.GELATO;
food = Coffee.CAPPUCCINO;
}
}
만약 에 enum 유형 이 Food 인 터 페 이 스 를 실현 한다 면 우 리 는 그 실례 를 Food 로 전환 할 수 있 기 때문에 상례 의 모든 것 이 Food 이다.
그러나 많은 유형 과 접촉 해 야 할 때 인 터 페 이 스 는 enum 보다 좋 지 않다.예 를 들 어 '매 거 진 매 거 진' 을 만 들 려 면 새로운 enum 을 만 든 다음 에 Food 의 모든 enum 류 를 인 스 턴 스 로 포장 할 수 있 습 니 다.
package enumerated.menu;
import com.buba.util.Enums;
public enum Course {
APPETIZER(Food.Appetizer.class), MAINCOURSE(Food.MainCourse.class), DESSERT(Food.Dessert.class),
COFFEE(Food.Coffee.class);
private Food[] values;
private Course(Class extends Food> kind) {
values = kind.getEnumConstants();
}
public Food randomSelection() {
return Enums.random(values);
}
}
위의 프로그램 에서 모든 Course 의 인 스 턴 스 는 해당 하 는 Class 대상 을 구조 기의 매개 변수 로 합 니 다.getEnumConstants () 방법 을 통 해 이 Class 대상 에서 어떤 Food 하위 클래스 의 모든 enum 인 스 턴 스 를 얻 을 수 있 습 니 다.이 인 스 턴 스 는 random Selection () 에서 사 용 됩 니 다.따라서 모든 Course 인 스 턴 스 에서 푸드 를 무 작위 로 선택 하면 메뉴 를 만 들 수 있 습 니 다.
package enumerated.menu;
public class Meal {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
for (Course course : Course.values()) {
Food food = course.randomSelection();
System.out.println(food);
}
System.out.println("-----------");
}
}
}
이 예 에서 우 리 는 모든 Course 인 스 턴 스 를 옮 겨 다 니 며 '매 거 진 매 거 진' 값 을 얻 을 수 있 습 니 다.잠시 후, VendingMachine. 자바 에서 우 리 는 다른 조직 이 인 스 턴 스 를 매 거 하 는 방식 을 보 았 으 나, 그것 도 다른 제한 이 있 습 니 다.
또 하나의 enum 을 다른 enum 에 끼 워 넣 는 보다 간결 한 관리 방법 도 있다.이렇게:
package enumerated;
import com.buba.util.Enums;
public enum SecurityCategory {
STOCK(Security.Stock.class), BOND(Security.Bond.class);
Security[] values;
SecurityCategory(Class extends Security> kind) {
values = kind.getEnumConstants();
}
interface Security {
enum Stock implements Security {
SHORT, LONG, MARGIN
}
enum Bond implements Security {
MUNICIPAL, JUNK
}
}
public Security randomSelection() {
return Enums.random(values);
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
SecurityCategory category = Enums.random(SecurityCategory.class);
System.out.println(category + ": " + category.randomSelection());
}
}
}
Security 인터페이스의 역할 은 포 함 된 enum 을 하나의 공공 유형 으로 조합 하 는 것 이 필요 하 다.그 다음 에 Security Category 는 Security 의 enum 을 구조 기의 매개 변수 로 사용 하여 조직 적 인 효 과 를 낼 수 있 습 니 다.
만약 우리 가 이런 방식 을 Food 의 예 에 응용 한다 면 결 과 는 이렇게 해 야 한다.
package enumerated.menu;
import com.buba.util.Enums;
public enum Meal2 {
APPETIZER(Food.Appetizer.class), MAINCOURSE(Food.MainCourse.class), DESSERT(Food.Dessert.class),
COFFEE(Food.Coffee.class);
private Food[] values;
private Meal2(Class extends Food> kind) {
values = kind.getEnumConstants();
}
public interface Food {
enum Appetizer implements Food {
SALAD, SOUP, SPRING_ROLLS;
}
enum MainCourse implements Food {
LASAGNE, BURRITO, PAD_THAI, LENTILS, HUMMOUS, VINDALOO;
}
enum Dessert implements Food {
TIRAMISU, GELATO, BLACK_FOREST_CAKE, FRUIT, CREME_CARAMEL;
}
enum Coffee implements Food {
BLACK_COFFEE, DECAF_COFFEE, ESPRESSO, LATTE, CAPPUCCINO, TEA, HERB_TEA;
}
}
public Food randomSelection() {
return Enums.random(values);
}
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
for (Meal2 meal : Meal2.values()) {
Food food = meal.randomSelection();
System.out.println(food);
}
System.out.println("-------------");
}
}
}
사실은 이것 은 코드 를 재 구성 한 것 일 뿐 이지 만 대부분 상황 에서 이런 방식 은 당신 의 코드 를 더욱 뚜렷 한 구 조 를 가지 게 합 니 다.
만약 본문 이 당신 에 게 큰 도움 이 된다 면, 좋아요 도 눌 러 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA 객체 작성 및 제거 방법정적 공장 방법 정적 공장 방법의 장점 를 반환할 수 있습니다. 정적 공장 방법의 단점 류 공유되거나 보호된 구조기를 포함하지 않으면 이불류화할 수 없음 여러 개의 구조기 파라미터를 만났을 때 구축기를 고려해야 한다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.