0
public class classifyTweet {

  public static class MapClass 
          extends Mapper<LongWritable, Text, Text, Text> {

  static final Configuration conf = new Configuration();

  protected void map(LongWritable key, Text value, Context context) 
             throws IOException, InterruptedException {

  StandardNaiveBayesClassifier classifier = new StandardNaiveBayesClassifier(NaiveBayesModel.materialize(new Path(modelPath), conf));

    }
  }
 }

我只想初始化分类器变量一次,materialize 方法抛出 IOEception,如果我在 map 方法之外声明它并且像配置对象初始化一样,它会给出 IOException 的编译错误。我怎样才能只初始化一次?

4

2 回答 2

1

制作 StandardNaiveBayesClassifier - 单例

public class StandardNaiveBayesClassifier {
private static StandardNaiveBayesClassifier instance;

public static StandardNaiveBayesClassifier getInstance(... you params) {
    if (instance == null)
        instance = new StandardNaiveBayesClassifier();
    return instance;
}

private StandardNaiveBayesClassifier() {
}

}

于 2013-06-24T08:32:52.223 回答
1

您可以使用静态块来初始化classifier变量一次。

public class classifyTweet {

  public static class MapClass 
          extends Mapper<LongWritable, Text, Text, Text> {

  static final Configuration conf = new Configuration();

  static final StandardNaiveBayesClassifier classifier;

  static {
      try {
       classifier = new StandardNaiveBayesClassifier(NaiveBayesModel.materialize(new Path(modelPath), conf));
      }
      catch(IOException e) {
          e.printStackTrace();
          System.out.println("Initialization failed.");
      }
  }

  protected void map(LongWritable key, Text value, Context context) 
             throws IOException, InterruptedException {

  //do some work...

    }
  }
 }

我假设在静态块中modelPath创建对象时变量在范围内。classifier你什么都不说。

于 2013-06-24T08:33:42.807 回答