ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-12-08 02:04:06  阅读:293  来源: 互联网

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


情况是,我必须对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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有