Java中的构造函数参数是否有任何要求

时间:2014-11-10 14:47:36

标签: java constructor

通常,costructor就像下面的

private int occurence;
private String content;
public Word(String content,int occurence)
{
   this.content= content;
   this.occurence = occurence;
}

但我可以设置不直接分配给属性但需要计算属性值的参数吗?

例如,文章类中有一种名为 calOccurence(字符串内容)的方法可以根据文章计算出现的情况。那么我可以建立像这样的建设者吗?

public Word(String content, Article base)
{
   this.content= content;
   this.occurence = base.calOccurence(content);
}

如果 calOccurence 功能属于 Word 类,如 calOccurence(字符串内容,文章基础),该怎么办?

public Word(String content, Article base)
{
   this.content= content;
   this.occurence = this.calOccurence(content, base);
}

看起来很奇怪,但我的队友编写了如上所述的代码。我想知道这是否合理?

2 个答案:

答案 0 :(得分:1)

因为没有文章就不能存在单词的出现,我认为最好从Word类中省略出现字段,并且只在Article类中使用它。

像这样的东西

public class Word {
    String text;
    Article article;

    public Word(String text, Article article) {
        this.text = text;
        this.article = article;
    }

    // other code
}

public class Article
    String content;
    public Article(String content) {
        this.content = content;   
    }

    public int calOccurrence(Word word) {
        // Calculate the occurrence of word.text in this.content
    }

    // other code
}

答案 1 :(得分:0)

构造函数应始终确保生成的对象已完全初始化并可以使用。调用类中的其他方法来完成这项工作是完全可以接受的,但是你必须确保它们可以处理处于未定义状态的对象。

在您的示例中,如果在设置this.calOccurence之前调用this.content,则this.calOccurence方法仍需要工作。这就是为什么该方法不需要依赖this.content变量,而是要求您传入内容值。将content作为参数传递,而不是依赖于课程'属性确保它始终具有所需的所有数据。

现在,如果并不总是需要出现次数,那么将它转换为惰性属性并且仅在需要时才计算其值可能是更好的策略。