gpt4 book ai didi

java - 父类(super class)的构造函数在我不希望的情况下被输入

转载 作者:行者123 更新时间:2023-12-02 11:34:26 25 4
gpt4 key购买 nike

我有一个扩展 PageRankSparse 的类 PageRankMonteCarloPageRankMonteCarlo 有一个在 main() 中调用的构造函数。在构造函数内部,调用 PageRankSparse.readDocs() 来设置 PageRankMonteCarlo 对象的一些变量。

当我运行 PageRankMonteCarlo 时,PageRankSparse 的构造函数被执行,即使我不希望它这样做。这会导致 readDocs 被调用两次,因为 readDocs 也在 PageRankSparse() 中被调用。代码如下:

PageRankMonteCarlo.java:

package pagerank;

public class PageRankMonteCarlo extends PageRankSparse {

public static void main(String[] args) {
if (args.length != 1) {
System.err.println("Please provide a filename");
}
new PageRankMonteCarlo(args[0]);
}

public PageRankMonteCarlo(String filename) {
NUMBER_OF_DOCS = readDocs(filename);
System.out.printf("NUMBER_OF_DOCS: %d\n", NUMBER_OF_DOCS);

}
}

PageRankSparse.java:

public class PageRankSparse {


public PageRankSparse( String filename ) {
int noOfDocs = readDocs( filename );
NUMBER_OF_DOCS = noOfDocs;
iterate( noOfDocs, 1000 );
}

// For testing
public PageRankSparse() {
int noOfDocs = readDocs("links5.txt");
NUMBER_OF_DOCS = noOfDocs;
}


/* --------------------------------------------- */


/**
* Reads the documents and fills the data structures.
*
* @return the number of documents read.
*/
int readDocs( String filename ) {
int fileIndex = 0;
System.out.println("reading...");
}

public static void main( String[] args ) {
if ( args.length != 1 ) {
System.err.println( "Please give the name of the link file" );
}
else {
new PageRankSparse( args[0] );
}
}
}

输出:

reading...
reading...
NUMBER_OF_DOCS: 0

如您所见,readDocs 已执行两次。这会导致意外行为。

如何确保 readDocs 仅执行一次?我已经尝试过这个(从子类构造函数中删除 readDocs() 调用):

public class PageRankMonteCarlo extends PageRankSparse {


public static void main(String[] args) {
if (args.length != 1) {
System.err.println("Please provide a filename");
}
new PageRankMonteCarlo(args[0]);
}

public PageRankMonteCarlo(String filename) {
System.out.printf("NUMBER_OF_DOCS: %d\n", NUMBER_OF_DOCS);
}
}

但是有两个问题:

  1. 当子类构造函数甚至不使用它时,将它传递给子类构造函数感觉很奇怪。
  2. 调用了错误的父类(super class)构造函数。我想要执行 PageRankMonteCarlo(String filename) 。相反,会执行 PageRankMonteCarlo()

如何获得我想要的行为?

最佳答案

只需将文件名传递给父类(super class)构造函数即可。如果父类(super class)也需要做一些事情,那么应该在父类(super class)中处理。

public PageRankMonteCarlo(String filename) {
super(filename);
System.out.printf("NUMBER_OF_DOCS: %d\n", NUMBER_OF_DOCS);
}

如果您需要避免执行父类(super class)构造函数所做的事情(例如 iterate 调用),您可以使用另一个参数使其成为条件:

public PageRankSparse( String filename, boolean doIterate ) {
int noOfDocs = readDocs( filename );
NUMBER_OF_DOCS = noOfDocs;
if (doIterate) {
iterate( noOfDocs, 1000 );
}
}

并让子类调用super(filename, false);

此外,我建议删除“用于测试”的无参数构造函数,这是子类构造函数现在调用的内容(所有构造函数将自动调用 super() ,除非指定了 super 调用)。您可以通过使用 "links5.txt" 调用普通构造函数来测试该类。

关于java - 父类(super class)的构造函数在我不希望的情况下被输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49056615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com