在json中在控制台上打印Final Class

问题描述 投票:0回答:1

我试图在控制台上以json格式打印带有静态字段的最终类。我正在使用eclipse。

Stats是一个最终类,用于跟踪创建或存档的对象实例。例如。成员实例数,地点实例数等

    public final class Stats {

        public static Integer numMembers = 0;
        public static Integer numLocalities = 0;
        public static Integer numTowns = 0;

        public static void incrementMembers () { numMembers ++; }
        public static void incrementLocalities () { numLocalities ++; }
        public static void incrementTowns () { numTowns ++; }
    }

当我试图在json中打印时,我遇到了问题。它不会将Stats识别为Object实例,这是可以理解的。有没有办法在json中打印Stats类的当前状态?

public static void print () {

    System.out.println(GsonBuilder().setPrettyPrinting().create().toJson(Stats));
}
java json
1个回答
1
投票

您当前的方法不适用于JSON(或任何其他)序列化,并且无法按您希望的方式工作。

全局静态对象是一种反模式,因为它会在代码库中引入不需要的耦合。有两种方法可以解决这个问题,依赖注入和Singleton。在这两种情况下,“统计”对象都是具有非静态字段的普通对象。

public final class Stats {

    private int numMembers = 0;
    private int numLocalities = 0;
    private int numTowns = 0;

    public void incrementMembers () { numMembers ++; }
    public void incrementLocalities () { numLocalities ++; }
    public void incrementTowns () { numTowns ++; }

    // Getters...
}

(不知道你为什么使用Integer,这里没有必要)

依赖注入需要像Spring这样的框架。如果你还没有使用Spring,那么你可能会同时进行太多的改变和学习曲线。但这是长期的最佳方式。对DI的解释超出了答案的范围,但原则是框架负责实例化对象并在需要的地方“注入”它。

较轻的替代方案是“单例”模式(查找,有详细记录),其中对象包含对第一次访问时创建的单个实例的一个静态成员引用。

public final class Stats {
    ...
    private static Stats instance = null;
    public static Stats getInstance()
    {
        if (instance == null)
            instance = new Stats();
        return instance;
    }
}

(以上是简单的,忽略了线程问题,在使用之前研究模式)

然后,只要你需要引用(单个)Stats实例,你就可以了

Stats stats = Stats.getInstance();

在任何一种情况下,您都有一个可以序列化的实例。

© www.soinside.com 2019 - 2024. All rights reserved.