当前位置: 首页 > 图灵资讯 > 技术篇> 使 toString() 的创建自动化

使 toString() 的创建自动化

来源:图灵教育
时间:2024-02-25 13:55:55
参与大型项目的开发人员通常需要几个小时来编写有用的东西 toString 方法。即使他们不为每个类别提供自己的东西 toString 但每个数据容器都必须有自己的方法 toString 方法。让每个开发人员按照自己的方法编写 toString 方法可能会造成混乱;每个开发人员无疑都会提出一种独特的格式。因此,在调试过程中使用此类输出会增加不必要的麻烦,而且没有任何好处。因此,每个项目都应该是 toString 该方法规定了一个单一的格式,并使其创建自动化。

使 toString 我将在下面演示一个实用程序来创建自动化。你可以用它来实现它 toString 自动创建。该工具将自动为指定类生成规则和强大的规则 toString 该方法几乎消除了开发该方法的时间。它还对 toString() 集中管理格式。如果您更改了格式,则必须重生 toString 方法;然而,这仍然比手动将其改为数百个类容易得多。

维护生成的代码也很容易。如果您在类中添加更多属性,您也可能需要 toString 修改方法。因为 toString 该方法是自动生成的,因此您只需再次更改此类操作的实用程序。这比手动方法更简单,也不太可能犯错误。

本文无意解释代码 Reflection API;假设你已经理解了下面的代码 Reflection 基本概念。查看 Reflection API 您可以访问参考资源部分。实用程序的源代码如下:

package fareed.publications.utilities;import java.lang.reflect.*;public class ToStringGenerator{public static void main(String[] args){if (args.length == 0){System.out.println("Provide the class name as the command line argument");System.exit(0);}try {Class targetClass = Class.forName(args[0]);if (!targetClass.isPrimitive() && targetClass != String.class){Field fields[] = targetClass.getDeclaredFields();Class cSuper = targetClass.getSuperclass(); // 检索超类output(”StringBuffer buffer = new StringBuffer(500);"); // 构造缓冲区if (cSuper != null && cSuper != Object.class) {output("buffer.append(super.toString());"); // 超类的 toString()}for (int j = 0; j < fields.length; j++) {output("buffer.append(\"" + fields[j].getName() + " = \");"); // 附加域名if (fields[j].getType().isPrimitive() || fields[j].getType() == String.class) // 检查基本数据类型或字符串类型output(”buffer.append(this." + fields[j].getName() + ");"); // 附加基本数据类型域的值else{/* 它“不”基本数据类型域,因此,有必要检查聚集对象 NULL 值 */output("if ( this." + fields[j].getName() + "!= null )" ); output("buffer.append(this." + fields[j].getName() + ".toString());");output("else buffer.append(\"value is null\"); ");} // else 结束 } // output循环结束(”return buffer.toString();");} } catch (ClassNotFoundException e) {System.out.println("Class not found in the class path");System.exit(0);} }private static void output(String data){System.out.println(data);}}

代码输出通道代码的格式也取决于您的项目工具需求。一些开发人员可能喜欢将这些代码存储在磁盘上的用户定义文件中。其他开发人员 system.out 控制台非常满意。他们可以使用控制台手动复制或嵌入实际文件中的代码。我给你留下这些选择。本文只使用最简单的方法:system.out 语句。

这种方法的局限性这种方法有两个明显的局限性。第一个局限性是它不支持对象的循环包含。假如对象 A 包含对象 B 一个引用,一个对象 B 又包含对象 A 这个工具不能处理一个引用。然而,对于许多项目来说,这种情况很少发生。

第二个限制是在添加或减少成员变量后需要重生 toString 方法。因为无论是否使用这个工具,都需要完成这一步,所以这不是工具的独特问题。

总结在本文中,我解释了一个小型的自动实用程序,它可以真正提高开发人员的效率,在整个项目的工期中起着非常小但非常重要的作用。