如何在Java中实现抽象的静态方法?
关于是否不可能包含静态抽象 Java 方法,存在许多问题。关于这个问题的解决方法也有很多(设计缺陷/设计强度)。但是我找不到任何关于我即将陈述的具体问题。
在我看来,开发Java的人,以及很多使用它的人,并没有像我和许多其他人那样认为静态方法,作为类函数,或者属于类而不是任何对象的方法。那么有没有其他一些实现类函数的方法呢?
以下是我的例子:在数学中,一组是一组对象,可以使用某种合理的方式使用某种运算*相互组合 - 例如,正实数在正常乘法下形成一个组(x * y = x ×y),整数集形成一个组,其中“乘法”运算是加法(m * n = m + n)。
在Java中对此进行建模的一种自然方法是为组定义一个接口(或抽象类):
public interface GroupElement
{
/**
/* Composes with a new group element.
/* @param elementToComposeWith - the new group element to compose with.
/* @return The composition of the two elements.
*/
public GroupElement compose(GroupElement elementToComposeWith)
}
我们可以为我上面给出的两个示例实现此接口:
public class PosReal implements GroupElement
{
private double value;
// getter and setter for this field
public PosReal(double value)
{
setValue(value);
}
@Override
public PosReal compose(PosReal multiplier)
{
return new PosReal(value * multiplier.getValue());
}
}
和
public class GInteger implements GroupElement
{
private int value;
// getter and setter for this field
public GInteger(double value)
{
setValue(value);
}
@Override
public GInteger compose(GInteger addend)
{
return new GInteger(value + addend.getValue());
}
}
但是,组还有另一个重要属性:每个组都有一个标识元素 - 一个元素 e,使得组中的所有 x 的 x * e = x。例如,乘法下正实数的单位元为 1,加法下整数的单位元为 0。在这种情况下,为每个实现类提供一个方法是有道理的,如下所示:
public PosReal getIdentity()
{
return new PosReal(1);
}
public GInteger getIdentity()
{
return new GInteger(0);
}
但是在这里我们遇到了问题 - 该方法不依赖于对象的任何实例,因此应该声明(实际上,我们可能希望从静态上下文中引用它)。但是,如果我们将方法放入接口中,则我们无法在接口中声明它,因此它不能在任何实现类中。getIdentity
static
getIdentity
static
static
有没有办法实现此方法:getIdentity
- 强制 在所有实现上保持一致性,以便 每个实现都强制包含一个函数。
GroupElement
GroupElement
getIdentity
- 静态行为;也就是说,我们可以获取给定实现的标识元素,而无需为该实现实例化对象。
GroupElement
条件(1)本质上是说“是抽象的”,条件(2)是说“是静态的”,我知道这一点,并且在Java中是不兼容的。那么,语言中是否有一些相关的概念可以用来做到这一点呢?static
abstract