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

时间:2017-12-16 18:20:46

标签: java json

我正在尝试使用json格式在控制台上打印带有静态字段的final类。我正在使用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));
}

1 个答案:

答案 0 :(得分:1)

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

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

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的解释超出了答案的范围,但原则是框架负责实例化对象和"注入"它在任何需要的地方。

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

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();

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