Think In Java 19 장 매 거 유형
Java
의 단일 계승 체제 로 인해 다른 종류 로 계승 할 수 없습니다. public class EnumTest {
enum Test {
TEST_1("1"), TEST_2("2");
private String descript;
Test(String descript) {
this.descript = descript;
}
}
}
이 매 거 진 은 역 컴 파일 을 통 해 내부 javap EnumTest$Test.class
를 살 펴 본다. 또한 매 거 진 종 류 는 final
이 고 하위 클래스 Compiled from "EnumTest.java"
final class EnumTest$Test extends java.lang.Enum {
public static final EnumTest$Test TEST_1;
public static final EnumTest$Test TEST_2;
public static EnumTest$Test[] values();
public static EnumTest$Test valueOf(java.lang.String);
static {};
}
private
와 public
모두 같다. import static EnumTest.Test.*
Java
의 switch
자구 지원 유형자바 7 에 도 입 된
String
는 본질 적 으로 int
를 사용 하여 판단 하 는 hashCode()
과 equals()
values()
정적 함 수 는 컴 파일 러 가 기록 한 것 입 니 다. 위로 Enum
로 전환 한 후 잃 어 버 렸 습 니 다. Class
의 getEnumContants()
를 통 해 매 거 진 요 소 를 얻 을 수 있 습 니 다. enum FontConstant{
Blod{
@Override
void show() {
//TODO
}
},
Italilc{
@Override
void show() {
//TODO
}
},
Plain{
@Override
void show() {
//TODO
}
};
abstract void show();
}
EnumSet
과 EnumMap
의 사용add(...)
시의 순서 와 관계 가 없 으 며 enum
에서 밝 힌 순서 와 일치 합 니 다. public static void showEnumSet(){
EnumSet enumSet = EnumSet.noneOf(FontConstant.class);
enumSet.add(FontConstant.Blod);
enumSet.add(FontConstant.Plain);
enumSet.add(FontConstant.Italilc);
enumSet.add(FontConstant.Blod);
for(Iterator iter = enumSet.iterator(); iter.hasNext();){
System.out.println(iter.next());
}
}
출력:Blod Italilc Plain
이 를 통 해 알 수 있 듯 이
EnumSet
의 순 서 는 enum
의 성명 과 관련 되 고 중복 되 지 않 는 대상 만 추가 할 수 있다.EnumMap
과 EnumSet
의 순 서 는 같다. enum Handler {
HANDLER_1 {
@Override
boolean handler(Action action) {
return action.action == 1;
}
},
HANDLER_2 {
@Override
boolean handler(Action action) {
return action.action == 2;
}
};
abstract boolean handler(Action action);
}
public static class Action{
int action;
public Action(int action) {
this.action = action;
}
}
public static void handler(Action action) {
for (Handler handler : Handler.values()) {
if (handler.handler(action)) {
System.out.println(handler.name() + " Handle This Action");
return;
}
}
System.out.println("No One Can Handle");
}
public static void main(String[] args) {
Action a1 = new Action(1);
handler(a1);
Action a2 = new Action(2);
handler(a2);
Action a3 = new Action(3);
handler(a3);
}
수출 을 실현 한다.HANDLER_1 Handle This Action HANDLER_2 Handle This Action No One Can Handle
public void process(Status status){
switch(status.getStatus){
case A:
status.setStatus(B);
break;
case B:
status.setStatus(C);
break;
...
}
}
이것 은 사용 (if/else)/switch
으로 이 루어 진 것 이 고 우 리 는 enum
으로 이 루어 질 수 있다 enum Status {
A {
@Override
void process(Product pro) {
pro.status = B;
}
},
B {
@Override
void process(Product pro) {
System.out.println("OK");
pro.status = C; //reset
}
},
...
abstract void process(Product pro);
}
public static class Product{
private Status status = Status.A;
public void make(){
status.process(this);
}
}
public static void main(String[] args) {
Product product = new Product();
for (int i = 0; i < 10; i++) {
System.out.println(product.status.name());
product.make();
}
}
static class A {}
static class B extends A {}
static class C extends A {}
public static void print(A obj){
System.out.println("A");
}
public static void print(B obj){
System.out.println("B");
}
public static void print(C obj){
System.out.println("C");
}
public static void main(String[] args) {
A a = new A();
print(a);
A b = new B();
print(b);
A c = new C();
print(c);
}
```
> A
> A
> A
- ( )
```java
static class A {
public void print(){
System.out.println("A");
}
}
static class B extends A {
@Override
public void print() {
System.out.println("B");
}
}
static class C extends A {
@Override
public void print() {
System.out.println("C");
}
}
public static void main(String[] args) {
A a = new A();
a.print();
A b = new B();
b.print();
A c = new C();
c.print();
}
출력A B C
public enum Outcome { WIN, LOSE, DRAW } ///:~
interface Item {
Outcome compete(Item it);
Outcome eval(Paper p);
Outcome eval(Scissors s);
Outcome eval(Rock r);
}
class Paper implements Item {
public Outcome compete(Item it) {
return it.eval(this);
}
public Outcome eval(Paper p) {
return DRAW;
}
public Outcome eval(Scissors s) {
return WIN;
}
public Outcome eval(Rock r) {
return LOSE;
}
public String toString() {
return "Paper";
}
}
class Scissors implements Item {
public Outcome compete(Item it) {
return it.eval(this);
}
public Outcome eval(Paper p) {
return LOSE;
}
public Outcome eval(Scissors s) {
return DRAW;
}
public Outcome eval(Rock r) {
return WIN;
}
public String toString() {
return "Scissors";
}
}
class Rock implements Item {
public Outcome compete(Item it) {
return it.eval(this);
}
public Outcome eval(Paper p) {
return WIN;
}
public Outcome eval(Scissors s) {
return LOSE;
}
public Outcome eval(Rock r) {
return DRAW;
}
public String toString() {
return "Rock";
}
}
public class RoShamBo1 {
static final int SIZE = 20;
private static Random rand = new Random(47);
public static Item newItem() {
switch (rand.nextInt(3)) {
default:
case 0:
return new Scissors();
case 1:
return new Paper();
case 2:
return new Rock();
}
}
public static void match(Item a, Item b) {
// a b ,
// a.compete() a compete(),
// compete , b
//
System.out.println(a + " vs. " + b + ": " + a.compete(b));
}
public static void main(String[] args) {
for (int i = 0; i < SIZE; i++)
match(newItem(), newItem());
}
}
다 중 배포 란 a. plus (b) 를 호출 하 는 것 을 말 합 니 다. a 와 b 는 정확 한 유형 을 모 르 고 정상 적 인 상호작용 을 할 수 있 습 니 다.두 번 째 로 나 누 어 주 려 면 두 가지 방법 으로 호출 해 야 합 니 다. 첫 번 째 방법 은 첫 번 째 알 수 없 는 유형 을 결정 하고 두 번 째 방법 은 두 번 째 알 수 없 는 유형 을 결정 합 니 다.다 중 배 포 를 이용 하려 면 프로그래머 는 모든 유형 에 실제 적 인 방법 으로 호출 해 야 한다.일반적으로 프로 그 래머 는 하나의 방법 으로 더 많은 방법 을 호출 할 수 있 도록 어떤 설정 을 설정 해 야 하 며, 이 과정 에서 여러 유형 을 처리 할 수 있다.이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.