如何使用新方法在函数内部传递变量

How to Pass variables inside functions using new method

我的网络爬虫项目中有这段代码:

   public static void main(String[] args) throws Exception {
    String frontierUrl = "http://www.cnn.com";

    //creates a new instance of class WebCrawler
    WebCrawler webCrawler = new WebCrawler();

    //Add the frontier url to the queue first
    webCrawler.enque(new LinkNode(frontierUrl));
    webCrawler.processQueue();

}

 void enque(LinkNode link){
    link.setEnqueTime(new Date());
    QUEUE.add(link);
}

这是我的 LinkNode Class:

public class LinkNode implements Comparable<LinkNode>{
private String url;

public LinkNode(String url) {
    this.url = url;
}

它工作正常,没有错误。我试图了解这条线是如何工作的:

  webCrawler.enque(new LinkNode(frontierUrl));

所以我不想直接在其中传递变量 "frontierUrl",而是想更详细地编写这一行,例如使用 "new" 的语法形式 ..:[=​​14=]

abc a = new abc ( );

因为我是 java 中的新手,所以有没有办法更详细地编写这一行以便更好地理解它?或者这是传递它的正式方法 throw 函数 ?

  • new LinkNode(frontierUrl) 创建一个新的 LinkNode 对象。
  • webCrawler.enque(new LinkNode(frontierUrl)); 将创建的 LinkNode 对象传递给 enque 方法。

因此

webCrawler.enque(new LinkNode(frontierUrl));

相当于

LinkNode link = new LinkNode(frontierUrl);
webCrawler.enque(link);

只是没有多余的命名变量。

为什么要这样做?在 LinkNode 构造函数中传递 frontierUrl 没有错。

但是你当然可以随时这样做 webCrawler.enque(新链接节点(新字符串(frontierUrl)));

但在这种情况下,您总是创建一个新的 String 对象,而不是从 String Literal 池中获取它

如果您不需要在主方法中创建下面的 LinkNode 对象,您的方法似乎绝对适合此示例。如果您只想将对象传递给方法,则无需为该对象设置变量。通过这种方式,将少量变量传递给 LinkNode 构造函数更易读。

是的,有一些方法。您需要了解 Constructors,这是一种在 Java.

中创建 类 的方法

现在你的代码只允许做:

LinkNode frl = new LinkNode(frontierUrl)
webCrawler.enque( frl ); //you are passing your LinkNode Instance

另一种方法是更改​​您的 LinkNode 构造函数和 url 变量范围:

public class LinkNode implements Comparable<LinkNode>{
   public String url;

   public LinkNode() {} // this is called default constructor and it is
                        // not needed at all

并使用如下代码:

LinkNode frl = new LinkNode()
frl.url = frontierUrl;
webCrawler.enque( frl ); //you are passing your LinkNode Instance

另一种方法是为您的 LinkNode url 变量创建一个 setter 方法,例如

public class LinkNode implements Comparable<LinkNode>{
   private String url;

   public LinkNode() {}

   public void setUrl(String url){
        this.url = url;
   }

并将其用作

LinkNode frl = new LinkNode()
frl.setUrl( frontierUrl );
webCrawler.enque( frl ); //you are passing your LinkNode Instance

最后一种方法比第二种方法更好,因为它正在做 Encapsulation,这在 Java 上是一个很好的实践。