Это не имеет ничего общего с изменчивостью строк, а также с порядком выполнения кода.
Ваш setup
метод будет вызываться только после выполнения любых команд на уровне класса. Порядок написания кода ничего не меняет. Если бы вы переписали верхнюю часть вашего кода в том порядке, в котором он фактически выполняется, вы бы получили:
public class EMapper extends Mapper<LongWritable, Text, Text, Text> {
String wordstring = "abcd";
String jkl = String.valueOf(wordstring);
public void setup(Context context) {
Configuration config = new Configuration(context.getConfiguration());
wordstring = config.get("mapper.word"); //By the time this is called, jkl has already been assigned to "abcd"
}
Так что не удивительно, что jkl
по-прежнему abcd
. Вы должны установить jkl
в методе setup
, например:
public class EMapper extends Mapper<LongWritable, Text, Text, Text> {
String wordstring;
String jkl;
public void setup(Context context) {
Configuration config = new Configuration(context.getConfiguration());
wordstring = config.get("mapper.word");
jkl = wordstring;
//Here, jkl and wordstring are both different variables pointing to "ankit"
}
//Here, jkl and wordstring are null, as setup(Context context) has not yet run
public void map(LongWritable key, Text value, Context context)
throws InterruptedException, IOException {
//Here, jkl and wordstring are both different variables pointing to "ankit"
context.write(new Text("wordstring=" + wordstring),
new Text("jkl=" + jkl));
}
Конечно, на самом деле вам не нужен jkl
, вы можете просто использовать wordstring
.