浏览器大全:是一个提供流行浏览器教程、在线学习分享的学习平台!

使toString() 的创建自动化

参与大项目的开发人员通常要花数个小时编写有用的 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 方法。因为不管用不用这个工具都需要完成这一步,所以这不是工具特有的问题。

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

相关软件

2345加速浏览器官方版

2345加速浏览器官方版 | 56.2MB

2345加速浏览器官方版

新一代2345加速浏览器采用Chromium和IE双内核,主打极速与安全特性。基于Chromium深度定制,引入网页智能预加载技术,访问网页更快速..

QQ浏览器官方正式版

QQ浏览器官方正式版 | 49.67MB

QQ浏览器官方正式版

QQ浏览器秉承TT浏览器1-4系列方便易用的特点,但技术架构不同,交互和视觉表现也重新设计,采用Chromium内核+IE双内核,让浏览快速稳定...

百度浏览器最新版下载

百度浏览器最新版下载 | 13.3MB

百度浏览器最新版下载

q百度浏览器,是一款简洁轻快、智能懂你的浏览器。依靠百度强大的搜索平台,在满足用户浏览网页的基础上,它整合百度体系业务优势,带给用户更方便的浏览方式功能...

UC浏览器官方正式版

UC浏览器官方正式版 | 44.2MB

UC浏览器官方正式版

UC浏览器(UC Browser)是UC Mobile Limited在2004年8月开发的一款软件,分uc手机浏览器和uc浏览器电脑版。UC浏览器是全球使用量最大的第三方手机浏览器...

猎豹浏览器2022最新版下载

猎豹浏览器2022下载 | 45MB

猎豹浏览器2022最新版下载

猎豹安全浏览器对Chrome的Webkit内核进行了超过100项的技术优化,访问网页速度更快。其具有首创的智能切换引擎,动态选择内核匹配不同网页...

360安全浏览器官方版下载

360安全浏览器下载 | 21.4MB

360安全浏览器官方版下载

360安全浏览器拥有全国最大的恶意网址库,采用恶意网址拦截技术,可自动拦截挂马、欺诈、网银仿冒等恶意网址。独创沙箱技术,在隔离模式即使访问****也不会感染...