加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

JAVA – 程序重启时静态变量重置

发布时间:2020-12-15 05:20:57 所属栏目:Java 来源:网络整理
导读:我有一个静态计数器变量的问题.在超类(“卡”)中,我有一个变量来计算注册卡的数量(这是一个票务系统).它是这样写的: public class Card implements Serializable { private int id; public static int nextNr= 000; Card next; public Card(int t) { id= ++
我有一个静态计数器变量的问题.在超类(“卡”)中,我有一个变量来计算注册卡的数量(这是一个票务系统).它是这样写的:

public class Card implements Serializable    {
    private int id;
    public static int nextNr= 000;
    Card next;

    public Card(int t)   {
        id= ++nextNr;
        next= null;
    }
}

该类实现了Serializable,我使用ObjectStream将卡写出到文件中.

但是如果我关闭程序并再次启动它,它可以从文件中读取并确认并再次将文件添加到我的cardregistry.但是,超类中的卡计数器变量被重置,我尝试注册的每张新卡都从001开始.我究竟做错了什么?
似乎无法在网上找到关于这个特定问题的任何信息.

解:
我使用DataOutputStream在退出时保存它,DataInputStream在启动时读取它.
我不知道这是否是最有效的方法,但它有效.非常感谢你的评论,它帮了我很多!!!!

abstract public class Card implements Serializable  {

private int type;
private int cardNr;
private static int nextNr = readCardNr();
Card next;   //COllections or not.. hmmmm

public Card(int t)   {
    cardNr= ++nextNr;
    next= null;
    type = t;
    writeCardNr();
}

public int getType(){
    return type;
}

public void setCardNr(int i) {
    cardNr= i;
}
public int getCardNr()  {
    return cardNr;
}


public static int readCardNr() {        
    try(DataInputStream inn= new DataInputStream(new FileInputStream("KortNummer")))   {
        nextNr= inn.readInt();
        inn.close();
        return nextNr;
    }
    catch(FileNotFoundException fnfe)   {
        skrivMld("Fant ingen tidligere registrerte kort. Starter nytt kortregister.");
        nextNr= 000;
        return nextNr;
    }
    catch(EOFException eofe)    {
        System.out.println("End of file");
    }
    catch(IOException ioe)  {
        skrivMld("Feilmelding: IO Exception");
    }
    return nextNr;
}

public void writeCardNr()    {
    try(DataOutputStream ut= new DataOutputStream(new FileOutputStream("KortNummer"))){
        ut.writeInt(cardNr);
    }
    catch(IOException ioe)  {
        skrivMld("Problem med skriving til fil.");
    }
}

解决方法

计数器是静态的.因此,它不是任何Card实例的状态的一部分,并且序列化所有卡将不会保存计数器的值.

保存此计数器值,重新加载并明确重置它,或者在启动时从所有反序列化卡中获取最大ID,将计数器重置为此最大值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读