【问题标题】:How can my method, which is being called by another class, obtain a variable from that class without passing it as a parameter?我的方法(被另一个类调用)如何从该类获取变量而不将其作为参数传递?
【发布时间】:2015-12-08 21:25:49
【问题描述】:

BayesianClassifier 中的一个方法调用下面的方法(Category 的一个方法):

public void updateProbabilities(Map<String, int> woordfrequenties) {
    for (Map.Entry<String, int> woordfrequentie : woordfrequenties.entrySet()) {
        String woord = woordfrequentie.getKey();
        int frequentie = woordfrequentie.getValue();
        int index = BayesianClassifier.getVocabulary().indexOf(woord);
    }
}

现在,它指出来自 BayesianClassifier 的非静态方法 getVocabulary 不能从这里的静态上下文中引用,我理解,但是该方法如何从调用的 BayesianClassifier 实例中获取字段 'vocabulary' 的值这个方法?如果不将整个词汇表作为参数传递,或者给类 Category 提供 BayesianClassifier 的实例作为字段,这肯定是可能的吗?

【问题讨论】:

  • 如果某个其他类的对象调用了您的方法怎么办?你怎么知道如何获得所需的索引?
  • 只传递vocabulary 作为参数有什么问题?它不是那么长,并且不会引起任何问题。但是,从技术上讲,您可以使用反射分析堆栈跟踪(但是,通常不要这样做)。查看完全相同的副本:stackoverflow.com/questions/15329566/…
  • 一般来说,一个方法——尤其是一个公共方法——对谁调用它一无所知。它只有它的参数和调用它的对象。这很好。
  • 谢谢大家的回复!我将只给类 Category 一个包含调用类 BayesianClassifier 的字段。

标签: java methods static field getter


【解决方案1】:

如 cmets 中所述,它可以通过反射来完成。如果您不能将词汇表作为参数传递,请在此处回答:Previous Answer to Same Question

如果您不想使用反射,您有两种选择:

选项 1:

调用updateProbabilities 时只需传入Vocabulary 对象。 Java 是按值传递,但这并不意味着整个 Vocabulary 对象都会被复制和传递。这解释了here。本质上,指向对象的指针的值将被传递,这样做只会占用一个“指针”的额外空间。

选项 2:

创建Category 对象时,将BayesianClassifier 添加为字段。

【讨论】:

    【解决方案2】:

    您可以使用以下代码:

    public class Category {
    private final BayesianClassifier bayesianClassifier;
    
    public Category(BayesianClassifier bayesianClassifier) {
      this.bayesianClassifier = bayesianClassifier;
    }
    
    public void updateProbabilities(Map<String, int> woordfrequenties) {
        for (Map.Entry<String, int> woordfrequentie : woordfrequenties.entrySet()) {
            String woord = woordfrequentie.getKey();
            int frequentie = woordfrequentie.getValue();
            int index = bayesianClassifier.getVocabulary().indexOf(woord);
        }
    } 
    

    public class Category {
    private BayesianClassifier bayesianClassifier;
    
    public void setBayesianClassifier(BayesianClassifier bayesianClassifier) {
      this.bayesianClassifier = bayesianClassifier;
    }
    
    public void updateProbabilities(Map<String, int> woordfrequenties, BayesianClassifier bayesianClassifier) {
        for (Map.Entry<String, int> woordfrequentie : woordfrequenties.entrySet()) {
            String woord = woordfrequentie.getKey();
            int frequentie = woordfrequentie.getValue();
            int index = bayesianClassifier.getVocabulary().indexOf(woord);
        }
    } 
    

    public void updateProbabilities(Map<String, int> woordfrequenties, BayesianClassifier bayesianClassifier) {
            for (Map.Entry<String, int> woordfrequentie : woordfrequenties.entrySet()) {
                String woord = woordfrequentie.getKey();
                int frequentie = woordfrequentie.getValue();
                int index = bayesianClassifier.getVocabulary().indexOf(woord);
            }
        }
    

    【讨论】:

    • 是的,我会用这个,谢谢!我只是想检查是否有一种方法可以在不将 BayesianClassifier 的实例作为字段添加到 Category 的情况下执行此操作。再次感谢!
    猜你喜欢
    • 2019-06-29
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    相关资源
    最近更新 更多