Java 匿名类作为实用函数?设计实际使用的参数,或一个参数(较大的对象)

标签 java software-design anonymous-class utility-method

情况是我必须为 Java 中的这么多函数使用函数指针(所以我这样做了 way )并将每个匿名类保存到接口(interface)的静态变量中,以便我可以直接使用它们。

 /** The Constant HARDLIM. */
    public static final TransferePatternable HARDLIM =
    new TransferePatternable() {
        public DoubleMatrix transfere(DoubleMatrix netSum, double theta) {
        return netSum.gt(theta);
        }
        public String getFuncName() {
        return "HARDLIM";
        }
    };

但问题是有时我不需要提供 Theta,所以如果我删除它,多态性将不起作用,(10 个函数中有 2 个不需要 theta)所以我不得不把它(函数声明约定现在很难看)所以我想传递实际上包含 netsum 和 theta 的整个对象。

但我开始担心,因为它也会破坏此功能的真正用途。所以最后我建议我把这些函数分开(非匿名),然后让匿名函数使用它们,但参数是对象。像下面这样:

 /** The Constant HARDLIM. */
    public static final TransferePatternable HARDLIM =
    new TransferePatternable() {
        public DoubleMatrix transfere(MyObject obj) {
        return MyObjectUtilFun.hardlim(obj.getNetsum,obj.getTheta);
        }
        public String getFuncName() {
        return "HARDLIM";
        }
    };

那么我采取的步骤是否正确?或者我在胡闹,请指导我!

最佳答案

你真的需要实例是public static final吗?如果您可以在任何引用 theta 的地方实例化该实例,那么您的匿名类就可以使用该 theta 引用。例如:

final double theta = 123d;
class TransferePatternable {
    public String transfere(String whatever) {
        return whatever + theta;
    }
}
TransferePatternable myInstance = new TransferePatternable();
myInstance.transfere("arg");

或者,您可以将输入指定为通用类型,这样您的 MyObject 就不必是所有可能输入的超集,而是可以因 TransferePatternable 类型而异。显然这里的缺点是您需要知道您正在调用什么类型才能提供正确的输入,但如果您不想在某些情况下提供 theta,则无论如何您都需要知道这一点。

最后,此问题的另一种常见解决方案是仅用一个 Map 替换所有方法参数。然后,你想传什么就传什么!这有很多明显的缺点,但很多 API 正是这样做的,通常您会看到它们将 map 称为“上下文”。下面是几个例子:

  • javax.servlet .ServletRequest将参数存储在Map
  • AOP 有 javax.interceptor.InvocationContext
  • Spring 的 IoC 容器基本上是一个大型 Map 命名 javabean
  • JSP 表达式语言允许您引用 Implicit Objects基本上存储在几个 Map

我自己在多年前用 java 实现类似 Excel 的公式语言时就使用过这个 Map 解决方案。这样的公式可以解析为函数和变量,在执行函数时,我们提供了一个 Map,其中包含以变量名作为键值的变量。显然,您仍然需要了解您正在调用的内容,事实上,我们总是对在 Map 中提供正确输入很容易的公式有足够的了解。但我必须再次提醒您:这种代码很难实现和维护。除非您预计随着时间的推移会增加大量功能,否则不要走这条路。它不是 OO 友好的,它应该是最后的手段。

关于Java 匿名类作为实用函数?设计实际使用的参数,或一个参数(较大的对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7236814/

相关文章:

java - Android Studio 带有微调器选择的多个数字

java - 通过访问器方法封装 java.util.Properties 访问被认为是不好的做法?

java - 使用这个系统有什么问题吗?

java - XMLStreamReader - 文件末尾会发生什么?

java - codehaus 关闭后 : http://enunciate. codehaus.org/schemas/enunciate-1.27.xsd 的新位置是什么?

java - 开关内的数组

java - 以编程方式对不同的类进行分组和类型提示

java - Java 中匿名类是如何编译的?

java - 可以用mockito验证以匿名内部类作为参数的方法调用吗?

java - 单元测试验证从匿名类中的回调返回的对象