Java 界面中的静态方法

Java 界面中的静态方法,java,Java,我定义了一个接口IPersistent,它有两种方法load和save。使用这些方法,我可以使用它们想要的任何方法加载或保存实现类 public interface IPersistent { void save(); void load(int id); } 我现在想要的是实现一个deleteAll方法,但它必须是一个静态方法,因为它作用于类级别,而不是对象级别。我尝试在接口中使用静态方法,但这是不可能的,因为我需要在接口中实现它,而不是在任何实现类中实现它 典型用法如下所示

我定义了一个接口
IPersistent
,它有两种方法
load
save
。使用这些方法,我可以使用它们想要的任何方法加载或保存实现类

public interface IPersistent {
    void save();
    void load(int id);
}
我现在想要的是实现一个
deleteAll
方法,但它必须是一个静态方法,因为它作用于类级别,而不是对象级别。我尝试在接口中使用静态方法,但这是不可能的,因为我需要在接口中实现它,而不是在任何实现类中实现它

典型用法如下所示:

class Foo implements IPersistent {
   void load(int id) { ... }
   void save() { ... }
   static void deleteAll() { ... }
}

List<foo> fooList = ...;
Foo.deleteAll();
for (Foo f: fooList) {
  f.save();
}
类Foo实现了IPersistent{
无效加载(整数id){…}
void save(){…}
静态void deleteAll(){…}
}
列表傻瓜=。。。;
Foo.deleteAll();
对于(Foo f:傻瓜){
f、 save();
}

我该如何实现这一点?

您应该有一个抽象类而不是接口,并使所有使用
deleteAll()
的类扩展该类。

遵循java SE约定,如中所示:

Path path = Paths.get("...");
File file; ... Files.copy(...);
Collection colxn = ...; Collections.sort(colxn);
在您的情况下,这将是一个带有静态方法的实用程序类:

public class Persistents {
    private Persistens() {}
    public static void deleteAll() { ... }
}

由于静态方法不能被重写,您的想法在Java中实现起来相当复杂。
我考虑另一种方法,使用通用静态方法和注释

public final class PersitenceTools {
  public static <T extends IPersistent> void deleteAll(Class<T> clazz) {
    // stuff
  }
}
最后,您将能够装饰
Foo

@PeristenceInfo(info1="Foo")
public class Foo implements IPersistent {
  // stuff
}

并通过
clazz.getAnnotation(PersistenceInfo.class).info1()

deleteAll
中获取此信息,为什么不使用抽象类而不是接口?因此您会遇到类似于@Nizil的问题:我有Java 8,但它只有一个实现。我希望每个类都有一个实现。@Naveed abstract static似乎不允许创建一个新的抽象类,将静态方法放在该类中并保留接口如何?abstract static似乎不允许抽象类中使用静态方法。@Zarathustra是,但是我想覆盖每个子类中的静态方法。@BartFriederichs您不能覆盖静态方法,但可以覆盖其中一个。但不要这样做;)我更喜欢两种方式的混合,尼齐尔和拉伦斯·艾略的那种。一个带有一个静态泛型方法的抽象类。我正在尝试实现它,但是在
clazz.getAnnotation(PersistenceInfo.class)
@BartFriederichs上我得到了一个
null
,哦,对不起!我忘记了注释上的
@Retention(rentationpolicy.RUNTIME)
,以使其在运行时可用!我还添加了
@Target
,以确保此注释仅适用于类、接口或枚举@劳伦斯·艾洛sanswer@Zarathustra这也是我的第一个倾向,但是不允许使用
抽象静态
。@Zarathustra实际上,OP想要一个静态函数(因为
instance.deleteAll()
没有意义),所以使用抽象类对这个问题不是一个好的解决方案(此外,我总是将接口提升到抽象类之上)。我还考虑使用模板方法模式的解决方案,但仍然很难用静态函数实现。。。
@PeristenceInfo(info1="Foo")
public class Foo implements IPersistent {
  // stuff
}