【问题标题】:passing variable from static inner class to top class将变量从静态内部类传递到顶级类
【发布时间】:2015-05-10 23:13:43
【问题描述】:

所以我想在我的静态嵌套类中设置我的顶级类变量 foo 的值。我的最终目标是弄清楚如何在我正在编写的 MapReduce 程序中将参数从 Map 方法传递给 Reduce 方法。我将代码简化为仅是可读性的必要元素。

这是我所拥有的:

import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone
{
    static String top = "foo";

    public void setTop(String newValue) {
        this.top = newValue;
    }

    public static class InnerClass {
        String innerString = "bar";
        Ideone newOne = new Ideone();
        newOne.setTop(innerString ); //not legal

    }

    public static void main (String[] args) throws java.lang.Exception
    {
        System.out.println("Hello World " + top);
    }
}

在实际的 MapReduce 程序中,嵌套类是我的 Mapper,顶层类是整个 MapReduce 程序的名称,我最终将 Jar 并在我的 Hadoop 集群中运行。

【问题讨论】:

  • 要么不要将你的内部类设为“静态”,要么将 Ideone 类传入 InnerClass。
  • 问题肯定是您试图在方法之外运行过程代码?
  • 我希望您的解决方案考虑以下几点:在 map reduce 程序的情况下,代码执行将是分布式的(它将在不同机器上的多个 JVM 中运行)。此外,无法保证 reduce 步骤将重用为归约而创建的相同对象实例。
  • @MJSG,你提出了一个合理的问题。我实际上是在尝试将一个参数从 Mapper 传递给 Partitioner,该参数在跨集群分发到 Reducer 之前执行

标签: java mapreduce


【解决方案1】:

问题不在于静态内部类,也不在于嵌套类。它的类本身 - 这个可以工作:

public static class InnerClass {
    String innerString = "bar";
    Ideone newOne = new Ideone();
    {
       newOne.setTop(innerString ); //not legal
    }

}

或者在构造函数中调用setTop。您在示例中选择的语法完全无效。

另一个提示:不清楚为什么你有一个静态变量 top,它有一个非静态的 setter,它是通过构造一个调用 setter 的虚拟对象从另一个类调用的。为什么不简单地Ideone.top = innerString;

【讨论】:

  • 它不是静态块。静态块将以 static. 为前缀
  • 啊,你是对的。但是,问题仍然存在。
  • 这与初始化块无关。您只是不实例化内部类。将 new InnerClass(); 放在你的 main 中,它会起作用。
  • 感谢您的耐心等待,我想通了。您的解决方案和@manouti 都可以正常工作。
【解决方案2】:

将您的 InnerClass 定义替换为

public static class InnerClass {

    public void setOuterClassTop() {
        String innerString = "bar";
        Ideone newOne = new Ideone();
        newOne.setTop(innerString );
    }

}

它可以通过调用setOuterClassTop() 方法来工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2020-05-25
    相关资源
    最近更新 更多