Java 抽象方法:这是不好的做法吗?
Java abstract method: is this bad practice?
我的代码如下:
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 条件。这些 classes 的唯一区别是上面的抽象方法 "action"。常规条件(它扩展的 class)没有任何动作,但存储在条件 class' ArrayList 中,但这可能无关紧要。
ActionConditions 背后的想法是它们有一个整数,表示它们的条件,在本例中为 ACTION_CONDITION_ACTIVATE_ID,一个名称,在本例中为 "Activate",最后是一个执行某些操作的方法。该方法可以return任何东西,做任何它想做的事情,并且可以将任何东西作为它的参数。
我可以想到这个 class 的多种不同用途,但是它用 action 方法编写的方式,出于某种原因让我觉得不对劲。有没有更好的方法来完成 class 的功能?还是class写的够好?
当然,这是一个见仁见智的问题,但由于这是一个编码风格问题,我想发表意见是可以的。
编写一个可以接受任何参数和 return 它想要的任何东西的方法可以避免使用像 Java 这样的类型安全语言获得的很多东西。我敢打赌,除了编写一个采用任意数量的 Object
参数和 return 一个 Object
的方法之外,几乎肯定有更好的方法来实现您的最终目标。
如果不了解您需要用这样的 class 做什么,很难提出建议,但我觉得使用 generics 可能会对您有所帮助。对象的实例化器不仅可以传递一个动作 ID 来确定 class 会做什么,还可以提供所需的类型参数来确定动作方法将接受什么和 return.
按照上面的代码,匿名 class 使用看起来像这样:
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
class 中声明的 ActionCondition 的抽象 class 如下所示:
public static abstract class Condition.ActionCondition<R,P1,P2> extends Condition{
public abstract R action(P1 param1,P2 param2);
}
假设您希望操作始终接受不超过 2 个参数。您可能会看到如何将其推广到任意选择的最大参数数量。
注意: 从您的描述来看,您似乎是在将匿名 class 用法描述为抽象 class 的声明。这可能只是一个小的错误措辞,但结合您的一些非典型结构,我想知道您是否可能对抽象 and/or 匿名 classes 没有很好的理解。如果我上面的解释对你来说意义为 0,你可能想尝试阅读 Nested Classes, abstract classes, and anonymous classes
之间的区别
我的代码如下:
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 条件。这些 classes 的唯一区别是上面的抽象方法 "action"。常规条件(它扩展的 class)没有任何动作,但存储在条件 class' ArrayList 中,但这可能无关紧要。
ActionConditions 背后的想法是它们有一个整数,表示它们的条件,在本例中为 ACTION_CONDITION_ACTIVATE_ID,一个名称,在本例中为 "Activate",最后是一个执行某些操作的方法。该方法可以return任何东西,做任何它想做的事情,并且可以将任何东西作为它的参数。
我可以想到这个 class 的多种不同用途,但是它用 action 方法编写的方式,出于某种原因让我觉得不对劲。有没有更好的方法来完成 class 的功能?还是class写的够好?
当然,这是一个见仁见智的问题,但由于这是一个编码风格问题,我想发表意见是可以的。
编写一个可以接受任何参数和 return 它想要的任何东西的方法可以避免使用像 Java 这样的类型安全语言获得的很多东西。我敢打赌,除了编写一个采用任意数量的 Object
参数和 return 一个 Object
的方法之外,几乎肯定有更好的方法来实现您的最终目标。
如果不了解您需要用这样的 class 做什么,很难提出建议,但我觉得使用 generics 可能会对您有所帮助。对象的实例化器不仅可以传递一个动作 ID 来确定 class 会做什么,还可以提供所需的类型参数来确定动作方法将接受什么和 return.
按照上面的代码,匿名 class 使用看起来像这样:
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
class 中声明的 ActionCondition 的抽象 class 如下所示:
public static abstract class Condition.ActionCondition<R,P1,P2> extends Condition{
public abstract R action(P1 param1,P2 param2);
}
假设您希望操作始终接受不超过 2 个参数。您可能会看到如何将其推广到任意选择的最大参数数量。
注意: 从您的描述来看,您似乎是在将匿名 class 用法描述为抽象 class 的声明。这可能只是一个小的错误措辞,但结合您的一些非典型结构,我想知道您是否可能对抽象 and/or 匿名 classes 没有很好的理解。如果我上面的解释对你来说意义为 0,你可能想尝试阅读 Nested Classes, abstract classes, and anonymous classes
之间的区别