Lecturer 希望我们给一个对象一个 print() 方法而不是重载 toString()

Lecturer wants us to give an object a print() method instead of overloading toString()

当谈到重载控制台输出时,似乎普遍认为您应该重载 toString(),而不是 print()。

但是,我的讲师希望我创建一个具有 print() 方法的对象,目的是打印为该对象定制的特殊输出。

所以,我的问题是,这是正确的吗?好了吗?我应该只给对象一个重载的 toString() 方法吗?

这是他希望我们解决的代码:

public static void main(String[] args){
DVD dvd = new DVD(genre, title);
dvd.doSomething();
dvd.print();
}

toString()方法旨在return对象的String表示;在您的情况下,它可能 return 看起来像 Comedy - Titanic (1997) 的字符串。听起来您的讲师希望您在 print() 方法中执行的操作是将该输出发送到控制台——类似于 System.out.println(this).

更笼统地说,这对您了解最佳做法和提出问题很有帮助。但是,请记住,根据我的经验,许多(甚至大多数)讲师都不熟悉最佳实践,在这种情况下,您应该(1)与您的讲师澄清,然后(2)将其写在次​​优的如果老师坚持要那样做,那只是为了你的作业。

我认为您的讲师实际上希望您学习最佳实践,即使在本例中这是一个坏主意。想象一下,如果 DVD 是别的东西,而你不能只是 System.out.println 它。他是这样教你的,因为让我们说在屏幕上打印 DVD 图片只是为了测试会很困难而且效率不高。这是我的意见,但老师有一些技巧,我认为这是其中之一。想象一下打印方法现在只是一个 stub ,稍后你将不得不实现更高级的功能(比如在屏幕上打印 DVD 的图片)并且将它打印到控制台在这一刻是令人满意的,就是这样接口知道方法存在,功能在这个阶段并不重要。

没错。如果下一个练习是在 print() 中调用另一个函数怎么办? Object.toString() 文档说:

Returns a string representation of the object.

使用此方法的输出显示给您的最终用户并没有错,但主要用于内部调试目的。您绝对不想从 toString 方法调用另一个方法。 toString() 方法必须非常简单。

如果你想像这样添加对另一个函数的调用怎么办:

public void print() {
    System.out.println(getLabel());
    sendToThePrinter()
}

你看到问题了吗?如果之后将其放入 toString() 方法中,就会遇到麻烦。

My lecturer wants me to create an object that has a print() method, with the goal of printing a special output tailored to that object.

如果那是作业,那么这就是你应该做的。

至于print()toString(),他们可能有不同的目的。为了说明,假设您有一个 Person class 和 namephone 和多个地址字段(street1street2citystatezipcode)。

toString() 应该 return 一个有助于识别对象的简短描述性字符串。它经常在调试时使用,其中 List<Person> 将显示逗号分隔列表中的对象,例如

[John Doe, Jane Smith]

如果 toString() 方法 return 的信息太多,List.toString() 输出将无法用于调试。

print()是专门用来打印对象本身的,所以可能要打印多行,例如

Name:    John Doe
Phone:   123-555-1212
Address: 123 Main St.
         Apt. 5
         Pleasantville, NY 10570

您不希望 toString() 到 return 那样的多行字符串。