當前位置:首頁 » 服務存儲 » java單例枚舉存儲
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

java單例枚舉存儲

發布時間: 2022-11-19 00:22:15

⑴ 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)+"]");
}
}