2017-04-01 13 views
0

私は以下のコードで自動インクリメント番号を生成しています。自動インクリメントIDを生成する方法、およびプログラムを閉じてJavaで再び開くときにデフォルトに設定しないでください。

public class CoachRegForm extends javax.swing.JFrame { 

/** 
* Creates new form CoachRegForm 
*/ 
    private static int counter = 10000; 
    final private int coachId; 



public CoachRegForm() { 
    initComponents(); 
    coachId = counter++; 
    String staffIDInString=new Integer(coachId).toString(); 
    CoachRegFormIDShowLab.setText(staffIDInString);  
} 

プログラムによって保存された最後の番号を運ぶために任意の方法がありますこれは、システム内で動作しますが、私はプログラムを終了して再度実行したとき、それは10000

でデフォルトに戻り私はプログラムを開く次回に?あなたはまた、将来的に(あなたのプログラムのONEマルチスレッドインスタンス内)同時実行の問題を防ぐためのAtomicIntegerを使用して検討するかもしれないhttp://www.vogella.com/tutorials/JavaPreferences/article.html

+0

あなたがプログラムを閉じた後、それ以外の場合は失われます、どこかでこのカウンタを永続化する必要がありますそれは一時的にメモリに保存され、プログラムを終了した後に消去されます。 – Simon

+0

はい、@Simonが指摘しているように、そこにdbを保存したり、ファイルシステムを使ってカウンタを更新したりすることができます何度もプロパティファイルで –

+0

あなたはjavaのシリアル化を使用することができますhttp://stackoverflow.com/questions/26251006/best-way-to-implement-save-and-restore-object-attribute-state – praveen

答えて

0

いくつかのフィールドの値を格納するための良い方法は、環境設定です。もちろん

package preferences; 

import java.util.concurrent.atomic.AtomicInteger; 
import java.util.prefs.Preferences; 

public class PrefsAutoinc { 
    private Preferences prefs; 
    private static final String AI_SETTING_ID = "autoincrement"; 

    public void testPrefs() { 
     prefs = Preferences.userRoot().node(this.getClass().getName()); 

     AtomicInteger autoinc = new AtomicInteger(prefs.getInt(AI_SETTING_ID, 0)); 

     System.out.println("last saved value: " + autoinc); 

     System.out.println("next: " + autoinc.incrementAndGet()); 
     System.out.println("next: " + autoinc.incrementAndGet()); 

     prefs.putInt(AI_SETTING_ID, autoinc.get()); 
    } 

    public static void main(String[] args) { 
     PrefsAutoinc test = new PrefsAutoinc(); 
     test.testPrefs(); 
    } 
} 

あなたのプログラムが他の方法でデータベースを使用する場合@javaguyが示唆するように、データベースに自動インクリメント値を格納することは、より良い選択です。

ただし、アプリケーションの複数のインスタンスを同時に実行する予定で、idの一意性が必須である場合は、集中型dbストレージを使用することが唯一の選択肢です。各インスタンスはそれ自身の変数のコピーをインクリメントし、それをプリファレンスに保存するため、一部の値が失われます。あなたのJVMがシャットダウンするまで

1

あなたstaticcounterフィールドが(つまり、スタンドアロンmain()アプリケーションのためのプログラム終了)は、あなたが保存して再びcounter値を取得したい場合ので、を使用すると、データベースのような永続ストアを必要とするメモリ内に存在します(推奨)またはファイルシステム。

あなたは、データベースやファイルシステムAPI(すなわち、java.io.*)&

0

あなたがiniファイルに値を格納することができますに接続するために、データベースに接続する(java.sql.*すなわち、JDBC)をJava APIを使用することができます。変更するたびに値を更新する必要があります。

ユーザーが値を簡単に検出できないようにするには、データベースに格納できます。

とにかく、値がまだどこかに保存されていない場合にのみ、10000に初期化する必要はありません。

0

変数を保存して将来のプログラムの起動時に使用する必要がある場合は、クラスjava.util.propertiesを使用します。このクラスはファイルにデータを書き込み、ファイルから簡単に読み込むことができます。 私の例では、単にファイルから取得するには、ファイル

import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.Writer; 
import java.util.Properties; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class ProgrammProperties extends Properties { 

private String number_of_processors; 
private String processors; 

public ProgrammProperties() 
{ 
    this.processors = "Number of processors"; 
    this.number_of_processors = "0"; 
    File file = new File("props."); 
    String path = file.getAbsolutePath(); 
    File f = new File(path + ".properties"); 
    if (f.exists() != true) 
    { 
     try 
     { 
      Writer writer = new FileWriter(path + ".properties"); 
      this.setProperty(processors, Integer.toString(number_of_Processors())); 

     } catch (IOException ex) 
     { 
      Logger.getLogger(Properties.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

} 

public int number_of_Processors() 
{ 
    int num = Runtime.getRuntime().availableProcessors(); 
    return num; 
} 

public String getNumber_of_prozessors() 
{ 
    return number_of_processors; 
} 

} 

にプロセッサの数を節約する方法を示しています。

String p=new ProgrammProperties().getProperty("Number of processors"); 
関連する問題