⑴ java枚舉類型enum用法
用法如下:
用法一:常量 在JDK1.5之前,我們定義常量都是:public static fianl....。現在好了,有了枚舉,可以把相關的常量分組到一個枚舉類型里,而且枚舉提供了比常量更多的方法
用法六:使用介面組織枚舉
用法七:關於枚舉集合的使用
⑵ 設計模式之單例模式
單例設計模式理解起來非常簡單。一個類只允許創建一個對象(或者實例),那這個類就是一個單例類,這種設計模式就叫單例模式。
下面的示例中如果每個類都創建一個 Logger 實例,就可能造成日誌內容被覆蓋的情況。
如果有些數據在系統中只應保存一份,那就比較適合設計為單例類。比如,配置信息類,全局 ID 生成器等。
要實現一個單例,我們要考慮以下幾點:
懶漢式相對於餓漢式的優勢是 「支持延遲載入」 。但缺點也很明顯,因為使用了 synchronized 關鍵字導致這個方法的 「並發度很低」 。如果這個單例類偶爾會被用到,那這種實現方式還可以接受。但是,如果頻繁地用到,就會導致性能瓶頸,這種實現方式就不可取了。
這是一種既支持延遲載入、又支持高並發的單例實現方式。
在 java1.5 以下 instance = new Singleton(); 有指令重排問題,需要給 instance 成員變數加上 volatile 關鍵字,java1.5 之後不會再這個問題。
這種方式利用了 Java 的靜態內部類,有點類似餓漢式,但又能做到了延遲載入。
當外部類 Singleton 被載入的時候,並不會創建 SingletonHolder 實例對象。只有當調用 getInstance() 方法時,SingletonHolder 才會被載入,這個時候才會創建 instance。insance 的唯一性、創建過程的線程安全性,都由 JVM 來保證。所以,這種實現方法既保證了線程安全,又能做到延遲載入。
這是一種最簡單的實現方式,基於枚舉類型的單例實現。這種實現方式是通過 Java 枚舉類型本身的特性,保證了實例創建的線程安全性和實例的唯一性。
上面的單例類對象是進程唯一的,一個進程只能有一個單例對象。那如何實現一個線程唯一的單例呢?
假設 IdGenerator 是一個線程唯一的單例類。在線程 A 內,我們可以創建一個單例對象 a。因為線程內唯一,在線程 A 內就不能再創建新的 IdGenerator 對象了,而線程間可以不唯一,所以,在另外一個線程 B 內,我們還可以重新創建一個新的單例對象 b。
我們通過一個 ConcurrentHashMap 來存儲對象,其中 key 是線程 ID,value 是對象。這樣我們就可以做到,不同的線程對應不同的對象,同一個線程只能對應一個對象。實際上,Java 語言本身提供了 ThreadLocal 工具類,可以更加輕松地實現線程唯一單例。
⑶ java的單例模式怎麼能保證始終是單例
第一種:飽漢模式
public class SingleTon {
private SingleTon(){
}
//實例化放在靜態代碼塊里可提高程序的執行效率,但也可能更佔用空間
private final static SingleTon instance = new SingleTon();
public static SingleTon getInstance(){
return instance;
}
}
第二種:飢漢模式
public class SingleTon {
private SingleTon(){}
private static instance = null; //newSingleTon();
public static synchronized SingleTon getInstance(){
if(instance == null)
instance = new SingleTon();
return instance;
}
}
第三種:用枚舉
public enum SingleTon{
ONE;
}
第三:更實際的應用(在什麼情況用單例)
public classSequenceGenerator{
//下面是該類自身的業務功能代碼
private int count = 0;
public synchronized int getSequence(){
++count;
}
//下面是把該類變成單例的代碼
private SequenceGenerator(){}
private final static instance = new SequenceGenerator();
public static SingleTon getInstance(){
return instance;
}
}
第四:
public class MemoryDao {
privateHashMap map = new HashMap();
publicvoid add(Student stu1){
map.put(SequenceGenerator.getInstance().getSequence(),stu1);
}
//把MemoryDao變成單例
}
Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。
一般Singleton模式通常有幾種種形式:
第一種形式: 定義一個類,它的構造函數為private的,它有一個static的private的該類變數,在類初始化時實例話,通過一個public的getInstance方法獲取對它的引用,繼而調用其中的方法。
public class Singleton {
private Singleton(){}
//在自己內部定義自己一個實例,是不是很奇怪?
//注意這是private 只供內部調用
private staticSingleton instance = new Singleton();
//這里提供了一個供外部訪問本class的靜態方法,可以直接訪問
public staticSingleton getInstance() {
return instance;
}
}
第二種形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//這個方法比上面有所改進,不用每次都進行生成對象,只是第一次
//使用時生成實例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance;
}
}
其他形式:
定義一個類,它的構造函數為private的,所有方法為static的。
一般認為第一種形式要更加安全些
⑷ Java語言中的枚舉類型如何使用
Java語言中的枚舉類型的使用方法如下:
用法一:常量;
publicenumColor{
RED,GREEN,BLANK,YELLOW
}
用法二:switch;
enumSignal{
GREEN,YELLOW,RED
}
publicclassTrafficLight{
Signalcolor=Signal.RED;
publicvoidchange(){
switch(color){
caseRED:
color=Signal.GREEN;
break;
caseYELLOW:
color=Signal.RED;
break;
caseGREEN:
color=Signal.YELLOW;
break;
}
}
}
用法三:向枚舉中添加新方法;
publicenumColor{
RED("紅色",1),GREEN("綠色",2),BLANK("白色",3),YELLO("黃色",4);
//成員變數
privateStringname;
privateintindex;
//構造方法
privateColor(Stringname,intindex){
this.name=name;
this.index=index;
}
//普通方法
publicstaticStringgetName(intindex){
for(Colorc:Color.values()){
if(c.getIndex()==index){
returnc.name;
}
}
returnnull;
}
//getset方法
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetIndex(){
returnindex;
}
publicvoidsetIndex(intindex){
this.index=index;
}
}
用法四:覆蓋枚舉的方法;
publicclassTest{
publicenumColor{
RED("紅色",1),GREEN("綠色",2),BLANK("白色",3),YELLO("黃色",4);
//成員變數
privateStringname;
privateintindex;
//構造方法
privateColor(Stringname,intindex){
this.name=name;
this.index=index;
}
//覆蓋方法
@Override
publicStringtoString(){
returnthis.index+"_"+this.name;
}
}
publicstaticvoidmain(String[]args){
System.out.println(Color.RED.toString());
}
}
用法五:實現介面;
publicinterfaceBehaviour{
voidprint();
StringgetInfo();
}
{
RED("紅色",1),GREEN("綠色",2),BLANK("白色",3),YELLO("黃色",4);
//成員變數
privateStringname;
privateintindex;
//構造方法
privateColor(Stringname,intindex){
this.name=name;
this.index=index;
}
//介面方法
@Override
publicStringgetInfo(){
returnthis.name;
}
//介面方法
@Override
publicvoidprint(){
System.out.println(this.index+":"+this.name);
}
}
用法六:使用介面組織枚舉。
publicinterfaceFood{
enumCoffeeimplementsFood{
BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
}
enumDessertimplementsFood{
FRUIT,CAKE,GELATO
}
}
以上就是Java語言中枚舉類型的基本使用方法。
⑸ Java中枚舉類型存儲的元素可以重復嗎
Set是Java集合類的重要組成部分,它用來存儲不能重復的對象。枚舉類型也要求其枚舉元素各不相同。
⑹ JAVA 枚舉類型的編程
可以通過Scanner循環錄入數據,然後將數據封裝成bean對象,再遍歷列印每個bean對象
⑺ java中的enum有什麼用呢
enum也就是枚舉,像一個集合,只不過集合裡面的內容都固定了.
public enum Season3 {
SPRING("春天"),
SUMMER("夏天"),
AUTUMN("秋天"),
WINTER("冬天");
private String name;
private Season3(String name){
this.name = name;
}
public double getAvgTemp(){
switch(this){
case SPRING:return 10.2;
case SUMMER:return 25.8;
case AUTUMN:return 19.6;
case WINTER:return -3.6;
}
return 0.0;
}
public String getName(){
return name;
}
}
public class Test {
public static void main(String[] args) {
m3(Season3.SPRING);
}
public static void m3(Season3 season){
System.out.println(season.getName()+":"+season.getAvgTemp());
Season3[] allSeason = Season3.values();//返回枚舉類中所有枚舉值的一個數組
System.out.println(allSeason[0]);
}
}
⑻ 為什麼java中用枚舉實現單例模式會更好
單例模式實現方式有很多:在第一次使用的時候創建(構造函數中判斷是否已經有實例存在),在類載入的時候用靜態塊兒創建(靜態塊初始化),在應用啟動的時候創建。
在單線程中,基本大同小異,保證類的實例在整個應用中只有一個,都是沒問題的。
但是在多線程環境下,什麼時候創建這個實例是要考慮線程安全的。
枚舉類型最大的特點就是:構造函數是private修飾的,也就是不能對其進行new,對象的實例都是預定義的,也就是在類載入的時候都是定義好了的,不會給其它調用去創建實例的機會。
結論是,可以模擬這個思路去創建單例,不一定非得用枚舉,但是推薦用使用定義枚舉的方式去實現單例模式
⑼ java中枚舉用來干什麼的
枚舉是該類型的一個實例,相當於static final 類型的變數,可用於switch中,
//枚舉類:
packagecom.golden.test;publicenumOperation{
/**增*/
INSERT,
/**刪*/
DELETE,
/**改*/
UPDATE,
/**查*/
QUERY
}
//測試類
packagecom.golden.test;
publicclassTestEnum{
publicstaticvoidmain(String[]args){
System.out.println(Operation.DELETE);
System.out.println(Operation.valueOf("DELETE"));
System.out.println(Operation.valueOf("DELETE")==Operation.DELETE);
System.out.println("DELETE".equals(Operation.DELETE.toString()));
switch(Operation.DELETE){
caseINSERT:/**TODO*/break;
caseDELETE:/**TODO*/System.out.println("DELETE...");break;
caseUPDATE:/**TODO*/break;
caseQUERY:/**TODO*/break;
default:
break;
}
}
}
⑽ java中如何將枚舉值用循環輸出
java中可以私用enummap來保存枚舉值,示例如下:
privatestaticvoidtestEnumMap(){
//1.演示定義EnumMap對象,EnumMap對象的構造函數需要參數傳入,默認是key的類的類型
EnumMap<Light,String>currEnumMap=newEnumMap<Light,String>(
Light.class);
currEnumMap.put(Light.RED,"紅燈");
currEnumMap.put(Light.GREEN,"綠燈");
currEnumMap.put(Light.YELLOW,"黃燈");
//2.遍歷對象
for(LightaLight:Light.values()){
System.out.println("[key="+aLight.name()+",value="
+currEnumMap.get(aLight)+"]");
}
}