我的网络抓取工具项目中包含此代码:
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开始新的理解它?或者这是传递它的正式方法抛出函数?
答案 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
构造函数。