我正在尝试使用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));
}
答案 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();
在任何一种情况下,您都有一个可以序列化的真实 实例 。