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

时间:2015-02-07 09:20:18

标签: java variables web-crawler

我的网络抓取工具项目中包含此代码:

   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类:

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

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

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

  webCrawler.enque(new LinkNode(frontierUrl));

所以我不想传递变量&#34; frontierUrl&#34;直接在里面,想要在这个语法形式的更多细节中写这一行,使用&#34; new&#34; ..:

abc a = new abc ( );

有没有办法在更多的细节中写这一行,以便从java开始新的理解它?或者这是传递它的正式方法抛出函数?

4 个答案:

答案 0 :(得分:1)

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

因此

webCrawler.enque(new LinkNode(frontierUrl));

相当于

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

没有冗余的命名变量。

答案 1 :(得分:1)

是的,有一些方法。您需要了解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来说是一个很好的实践。

答案 2 :(得分:0)

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

但是你当然可以这样做 webCrawler.enque(new LinkNode(new String(frontierUrl));

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

答案 3 :(得分:0)

如果您在主方法中不需要下面创建的LinkNode对象,那么您的方法对于此示例似乎绝对正确。如果您只想将对象传递给方法,则不需要为对象设置变量。它通过这种方式更具可读性,只需将少量变量传递给LinkNode构造函数。