我试图在控制台上以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));
}
您当前的方法不适用于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();
在任何一种情况下,您都有一个可以序列化的实例。