【问题标题】:Java abstract method: is this bad practice?Java 抽象方法:这是不好的做法吗?
【发布时间】:2015-06-13 16:26:36
【问题描述】:

我下面的代码:

        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;
            }
        };

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

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

我可以想到这个类的多种不同用途,但是它用 action 方法编写的方式,只是因为某种原因让我犯了错误。有没有更好的方法来完成这个类的工作?还是这门课写得够好?

【问题讨论】:

    标签: java optimization coding-style


    【解决方案1】:

    当然,这是一个意见问题,但由于这是一个编码风格问题,我想发表意见是可以的。

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

    如果不知道更多关于你需要用这样的课程做什么,很难提出建议,但我觉得使用generics 可能会对你有所帮助。除了传递一个 action id 来确定类将做什么,对象的实例化器还可以提供所需的类型参数来确定 action 方法将接受和返回什么。

    按照上面的代码,匿名类的使用看起来像这样:

        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 个参数。您可能会看到如何将其推广到任意选择的最大参数数量。

    注意:从您的描述中,听起来您将匿名类的用法描述为抽象类的声明。这可能只是一个小小的错误措辞,但结合你的一些非典型结构让我想知道你是否可能对抽象和/或匿名类没有很好的理解。如果我上面的解释对您来说是 0,您可能想尝试了解 Nested Classesabstract classesanonymous classes 之间的区别

    【讨论】:

    • 正是我想要的!关于破坏 Java 类型安全部分的 any 参数,您是完全正确的。泛型是要走的路。我不敢相信我没想到!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多