Java抽象方法: is this bad practice?

标签 java optimization coding-style

我的代码如下:

        public static final Condition.ActionCondition ACTION_CONDITION_ACTIVATE = new Condition.ActionCondition(ACTION_CONDITION_ACTIVATE_ID, "Activate")
        {
            private static final long serialVersionUID = 5660276607942658334L;

            @Override
            public Object action(Object... params)
            {
                return null;
            }
        };

这扩展了我的类(class)条件。这些类的唯一区别是上面的抽象方法“action”。常规条件(它扩展的类)没有任何操作,但存储在条件类的 ArrayList 中,但这可能不是重点。

ActionConditions 背后的想法是,它们有一个整数,代表它们的条件,在本例中为 ACTION_CONDITION_ACTIVATE_ID,一个名称,在本例中为“Activate”,最后是一个执行某些操作的方法。该方法可以返回任何内容,做任何它想做的事情,并且可以将任何内容作为其参数。

我可以想到这个类的多种不同用途,但是它使用操作方法编写的方式,由于某种原因让我感到不舒服。有没有更好的方法来完成这个类的任务?或者类(class)写得足够好吗?

最佳答案

当然,这是一个意见问题,但由于这是一个编码风格问题,我认为给出意见是可以的。

编写一个可以接受任何参数并返回任何它想要的内容的方法,可以避免使用 Java 等类型安全语言所获得的很多好处。我敢打赌,除了编写一个采用任意数量的 Object 参数并返回一个 Object 的方法之外,几乎肯定有更好的方法来实现您的最终目标.

如果不了解更多关于您需要对这样的类(class)做什么的信息,很难提出建议,但我有一种感觉,使用 generics也许可以帮助你。对象的实例化器还可以提供所需的类型参数来确定操作方法将接受和返回的内容,而不是仅传递操作 ID 来确定类将执行的操作。

按照上面的代码,匿名类的使用将如下所示:

    public static final Condition.ActionCondition<MyReturnType,MyParamType1,MyParamType2> ACTION_CONDITION_ACTIVATE = new Condition.ActionCondition<MyReturnType,MyParamType1,MyParamType2>(ACTION_CONDITION_ACTIVATE_ID, "Activate")
    {
        private static final long serialVersionUID = 5660276607942658334L;

        @Override
        public MyReturnType action(MyParamType1 param1, MyParamType1 param2)
        {
            return null;
        }
    };

这假设在 Condition 类中声明了一个 ActionCondition 的抽象类,如下所示:

public static abstract class Condition.ActionCondition<R,P1,P2> extends Condition{
    public abstract R action(P1 param1,P2 param2);
}

这是假设您希望操作始终接受不超过 2 个参数。您可能会看到如何将其推广到任意选择的最大参数数。

注意:从您的描述来看,您似乎将匿名类的用法描述为抽象类的声明。这可能只是一个轻微的措辞,但是这与您的一些非典型结构相结合让我想知道您是否可能对抽象和/或匿名类没有很好的理解。如果我上面的解释对您来说毫无意义,您可能想尝试阅读 Nested Classes 之间的差异, abstract classes ,和anonymous classes

关于Java抽象方法: is this bad practice?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30820922/

相关文章:

c++ - 创建多少个线程?

ruby-on-rails - 使用实例变量或帮助程序管理用户权限

go - 如何避免为类似的 golang 结构重新实现 sort.Interface

java - java中的字符串空构造函数

java - 防止对 jxtable 中的前 3 行进行排序

java - 如何从文件初始化整数

mysql - 如果不满足查询中的条件,mysql 是否会移动到下一行?

java - Java 和 Android 之间的 Base64 编码/解码错误

c# - 优化 Linq : IN operator with large data

java - 在 IntelliJ IDEA 中启用代码样式