编程语言
首页 > 编程语言> > Java匿名类作为实用程序功能?设计实际使用的参数或一个参数(较大的obj)

Java匿名类作为实用程序功能?设计实际使用的参数或一个参数(较大的obj)

作者:互联网

情况是,我必须对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,所以如果我删除了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替换ALL方法参数.然后,您可以传递任何内容!这有很多明显的缺点,但是许多API确实做到了这一点,通常您会看到它们将地图称为“上下文”.这里有一些例子:

> javax.servlet .ServletRequests将参数存储在Map中
> AOP具有javax.interceptor.InvocationContext类
> Spring的IoC容器基本上是一个名为javabeans的大地图
> JSP表达式语言使您可以引用基本上存储在多个Map中的Implicit Objects

几年前,我自己在Java中实现类似Excel的公式语言时就使用了此Map解决方案.这样的公式可以解析为函数和变量,执行函数时,我们提供了一个Map,其中包含以变量名作为关键字的变量.显然,您仍然需要了解有关所调用内容的信息,实际上,我们始终对公式非常了解,因此可以轻松地在Map中提供正确的输入.但是我再次提醒您:这种代码很难实施和维护.除非您预期随着时间的推移会增加大量功能,否则请不要沿着这条路走.它不是面向对象的,它应该是不得已的方法.

标签:software-design,anonymous-class,utility-method,java
来源: https://codeday.me/bug/20191208/2088112.html