Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果一个方法中只需要一个对象字段,那么应该作为参数传递什么-对象还是字段值?_Java_Oop - Fatal编程技术网

Java 如果一个方法中只需要一个对象字段,那么应该作为参数传递什么-对象还是字段值?

Java 如果一个方法中只需要一个对象字段,那么应该作为参数传递什么-对象还是字段值?,java,oop,Java,Oop,假设有一个方法可以通过图书id搜索图书作者。应该将什么作为参数传递给这样的方法-仅book.id(int)或整本书对象 或者另一个例子。在java中,我需要对页面的当前url进行一些处理。应该将什么传递给这种仅方法的request.getRequestURL()或整个请求 我看到了每种方法的好处,但不能想出好的规则何时使用什么 谢谢。我不确定什么是最好的,是否有“规则”,但我通常只将所需的参数传递到方法中。因此,在第一个示例中,我只传入book.id,在第二个示例中,我只传入request.ge

假设有一个方法可以通过图书id搜索图书作者。应该将什么作为参数传递给这样的方法-仅book.id(int)或整本书对象

或者另一个例子。在java中,我需要对页面的当前url进行一些处理。应该将什么传递给这种仅方法的request.getRequestURL()或整个请求

我看到了每种方法的好处,但不能想出好的规则何时使用什么


谢谢。

我不确定什么是最好的,是否有“规则”,但我通常只将所需的参数传递到方法中。因此,在第一个示例中,我只传入book.id,在第二个示例中,我只传入request.getRequestURL()


我尽量避免传递超出我需要的内容。

我只会给出每个方法所需的内容(因此对于第二个问题:只需给出它
request.getRequestURL()

对于第一种方法,我会考虑定义这两种方法(但更喜欢
id
-one,因为如果你有一本书,你可以很容易地获得id,但不是相反)


实际上,没有规则,你应该直截了当地说出你需要的信息,在这种情况下是book.id。如果你考虑在将来扩展/共享你的搜索,你可以有一个重载的方法来接受一个书本对象,这样你就可以通过书本对象的其他属性来搜索。

如果你正在编写一个类的刀,你应该考虑有一个<代码>选择器> />代码>。.bySomethingElse(somethingElse)并传递此选择器,而不是大量使用findByXYZ方法。

除非有特定原因,否则最好使用连接较弱的方法。当将图书id仅传递给搜索方法时,您可以自由更改图书界面,而无需担心它可能会影响其他功能。在将来的某个时刻,您可能会发现您需要在请求处理程序之外的某个URL上执行完全相同的工作,因此避免对请求的不必要依赖是很好的。但是请注意,如果您经常调用
do\smth(request.getRequestURL())
,这可能会变得非常烦人。

这与相关,它基本上说明对象和方法应该只接收它们所需的内容,而不是通过另一个对象来获取它们实际需要的内容。如果您需要在方法中使用
书籍
中的多个字段,那么最好只取一本书。但一般来说,如果只依赖于您所需要的东西,那么系统中的耦合会更少


在这两个示例中,仅使用ID或URL可能更可取。特别是在URL的情况下(如果您想测试该方法),创建要测试的URL很容易,但创建要传递给该方法的请求更难(而且完全没有必要),因为该方法无论如何只会使用该URL。该方法也变得更普遍地适用于其他情况,而不是有请求对象的情况。

我同意前面的海报。我想补充一点,如果您发现自己需要对象的多个属性(id、title、author),那么我建议传递对象(或对象的接口)。短参数列表通常更可取。

考虑长期维护代码。您公开的任何方法都必须为您的用户提供支持。如果bookId是可预见的未来所需要的全部,那么我只想顺便说一下:这样,任何拥有bookId的人都可以使用您的方法,并且它会变得更强大

但是,如果您很有可能需要重构查找以使用Book的其他一些属性,那么请传入Book。

调用
Book.authors()
(注意:这是一个关于公认答案的不同观点。)

嗯,在领域建模的上下文中有一个隐式规则集。如果接收方正在执行独立于域模型的任务,则您将通过该字段。否则,您应该传递该对象,并且特定于模型的操作通过接收者访问“Book”对象的id属性而变得明确。最重要的是,如果访问属性的过程不仅仅是返回字段的引用(例如,属性访问器中的某些操作),那么很明显,您不希望跟踪代码中的所有实例,在这些实例中,您在将属性传递到各种方法之前取消了对属性的引用


进一步考虑的是在调用引用之前访问字段的后果(如果有的话),或者在接收者内部。我将成为一个异议者,并主张传递整个Book对象

原因1:类型检查。如果你只是传递一个整数ID,看代码就无法知道你是否得到了正确的整数ID。也许你传递了一个你认为是图书ID的整数变量,但实际上是作者ID。编译器不会帮你抓住这个错误,结果将以意想不到的方式出现问题

理由2:未来证明。有些人认为,如果您只是传递ID,那么您就可以选择稍后更改Book对象的结构,而不会破坏doSomethingWithBook(intID)方法。这是真的。另一方面,如果您传递整个Book对象,那么您可以选择更改doSomethingWithBook(Book Book Book)的内部内容(也许将来它会希望基于其他字段进行搜索),而不会破坏您调用doSomethingWithBook的任何位置(可能有很多)。我认为后者对你的帮助更大

在请求的情况下,我会给出一个不同的答案,因为我会考虑一个请求对象紧密链接到某个类型的接口(Web),因此会限制该对象的使用。

findAuthorsForBookId(int bookId)
findAuthorsForBook(Book b)
class Book {
    private int id;
    private List<Author> authors;
    // ... maybe some other book information
    public int getID() {
        return this.id
    }
    public void setID(int value) {
        this.id = value
    }
    public List<Author> getAuthors() {
        return this.authors.clone();
    }
    // ...
}
Book aBook = library.findBook(bookid);
List<Author> authors = aBook.getAuthors();
Book bookQuery = new Book().setID(bookid); // partially instantiated Book
Book aBook = library.findBook(bookQuery);
List<Author> aBook = book.getAuthors();