3.4 JAVAの列挙と汎型

13270 ワード

参照リンク:https://blog.csdn.net/qq_2709365/articale/detail/52180865
3.4 JAVAの列挙と汎型
一、エニュメレーション(定義された定数)
 
1.1使用シーン
1.JDK 1.5で 以前、私達が定義した定数はすべて次の通りです。 public static final… 。今はいいです。エニュメレーションがあります。関連する定数を一つのエニュメレート・タイプにグループ化して、エニュメレーションは常量より多い方法を提供します。 定数固定範囲
public enum Color {  
  RED, GREEN, BLANK, YELLOW  
} 
2.JDK 1.6前のswitch文はint、char、enumタイプのみをサポートしています。列挙を使って、コードの可読性をより強くすることができます。
enum Signal {  
    GREEN, YELLOW, RED  
}  
public class TrafficLight {  
    Signal color = Signal.RED;  
    public void change() {  
        switch (color) {  
        case RED:  
            color = Signal.GREEN;  
            break;  
        case YELLOW:  
            color = Signal.RED;  
            break;  
        case GREEN:  
            color = Signal.YELLOW;  
            break;  
        }  
    }  
} 
3.新しい方法とカバー方法を追加します。
public enum Color {  
    RED("  ", 1), GREEN("  ", 2), BLANK("  ", 3), YELLO("  ", 4);  
    //       
    private String name;  
    private int index;  
    //       
    private Color(String name, int index) {  
        this.name = name;  
        this.index = index;  
    }  
    //       
    public static String getName(int index) {  
        for (Color c : Color.values()) {  
            if (c.getIndex() == index) {  
                return c.name;  
            }  
        }  
        return null;  
    }  
    // get set     
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public int getIndex() {  
        return index;  
    }  
    public void setIndex(int index) {  
        this.index = index;  
    }  
} 

    //      
    @Override  
    public String toString() {  
        return this.index+"_"+this.name;  
    } 
4.複数の列挙を使用する(インターフェースで列挙を組織する)
public interface Food {  
    enum Coffee implements Food{  
        BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO  
    }  
    enum Dessert implements Food{  
        FRUIT, CAKE, GELATO  
    }  
5.列挙集合について
エニュメレート・セットの使用については、java.util.EnumMapと2つのエニュメレーションがあります。EnumSetは、集合中の要素が重複しないことを保証する。EumMapのkeyはenumタイプですが、valueは任意のタイプです。この2つのセットの使用についてはここで詳しく説明しないで、JDK文書を参照することができます。エニュメレート・オブジェクト間の値の比較は、値を直接比較するために使用され得るものであり、等しいかどうかは、equals法を使用しなければならないものではない。
列挙の実現の詳細と原理については、参考資料:『Thinking InJava』第四版:http://softbeta.iteye.com/blog/1185573
コンセプト:ビットセットベクトルスタック(Vector)先進的後出辞書(Dictory)ハッシュテーブル(Hashtable)属性(Propties)
3.泛型
Java汎型(generaics)はJDK 5に導入された新しい特性であり、汎型はコンパイル時のタイプの安全検出メカニズムを提供しており、このメカニズムはプログラマがコンパイル時に不正なタイプを検出することができる。汎型の本質はパラメータ化タイプ、つまり動作するデータタイプはパラメータに指定されます。 ArrayList heros = newArrayList();ADHero(物理攻撃ヒーロー)APHero(魔法攻撃ヒーロー)は、いずれもHeroのサブクラスで、一般的な利点があります。一般的な使い方は、容器の後ろにTypeを添加することができます。
1.該当するタイプ(下方への転換、基本タイプ)を規定する。
容器のパントがHeroであると仮定すれば、HeroのサブクラスAPHero、ADHeroはHeroとは無関係のタイプItemに入れられますか?それとも入れられませんか?
1.ArayList hero List extends Heroは、これはHero汎型またはそのサブタイプの汎型であることを示している。
2.ArayList hero List super Heroは、Heroパンチングまたはその父親タイプの汎型であることを示しています。
取り出したいだけで、挿入しないで使用しますか?extens Heroは挿入だけを望むなら、取り出さずに使いますか?super Heroは希望するならば、また挿入することができて、また取り出すことができて、ワイルドカードを使わないでくださいか?子類汎型は父類汎型の父類汎型に転換できません。子類汎型に変えてはいけません。
2.「extens」は、一般的な意味で「extens」または「implements」をどう使うか?
public class MaximumTest
{
   //            
   public static extends Comparable> T maximum(T x, T y, T z)
   {                     
      T max = x; //   x      
      if ( y.compareTo( max ) > 0 ){
         max = y; //y   
      }
      if ( z.compareTo( max ) > 0 ){
         max = z; //    z              
      }
      return max; //       
   }
   public static void main( String args[] )
   {
      System.out.printf( "%d, %d   %d        %d

", 3, 4, 5, maximum( 3, 4, 5 ) ); System.out.printf( "%.1f, %.1f %.1f %.1f

", 6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ) ); System.out.printf( "%s, %s %s %s
","pear", "apple", "orange", maximum( "pear", "apple", "orange" ) ); } }
3.汎型類:
public class Box {
   
  private T t; 
  public void add(T t) {
    this.t = t;
  }
  public T get() {
    return t;
  }
  public static void main(String[] args) {
    Box integerBox = new Box();
    Box stringBox = new Box();
 
    integerBox.add(new Integer(10));
    stringBox.add(new String("  "));
 
    System.out.printf("     :%d

", integerBox.get()); System.out.printf(" :%s
", stringBox.get()); } }
4.種類のワイルドカードは一般的に使用されますか?特定のタイプのパラメータの代わりに。例えば、List>は、論理的にはList、ListなどのすべてのListの親類である。
import java.util.*;
 
public class GenericTest {  
    public static void main(String[] args) {
        List name = new ArrayList();
        List age = new ArrayList();
        List number = new ArrayList();
        
        name.add("icon");
        age.add(18);
        number.add(314);
 
        getData(name);
        getData(age);
        getData(number);
       
   }
   public static void getData(List> data) {
      System.out.println("data :" + data.get(0));
   }
}