2015-04-09 5 views
4

Я определил интерфейс 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(); 
} 

Как бы это реализовать?

+0

Почему бы не использовать абстрактный класс вместо интерфейса? – Naveed

+2

Итак, у вас есть проблема, как [это] (http://stackoverflow.com/questions/21817/why-cant-i-declare-static-methods-in-an-interface)? – Aracthor

+0

@Nizil У меня есть Java 8, но у нее будет только одна реализация. Я хочу реализацию для каждого класса. –

ответ

2

Вы должны иметь абстрактный класс вместо интерфейса и сделать все классы, использующие deleteAll(), расширить этот класс.

+5

абстрактные статические, как представляется, не допускаются –

+0

Статические методы допускаются в абстрактных классах. – Zarathustra

+0

@ Zarathustra да, но я хочу переопределить статический метод в каждом подклассе. –

-1

Следуйте Java SE конвенции, как показано на:

Path path = Paths.get("..."); 
File file; ... Files.copy(...); 
Collection colxn = ...; Collections.sort(colxn); 

В вашем случае это будет утилита класс со статическими методами:

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

Как статический метод не может быть отменено, ваш идея довольно сложна для реализации на Java.
Я думаю о другом, используя общий статический метод и аннотации.

public final class PersitenceTools { 
    public static <T extends IPersistent> void deleteAll(Class<T> clazz) { 
    // stuff 
    } 
} 

Вы могли бы использовать его как это: PersistenceTools.deleteAll(Foo.class).
Примечание: Поскольку Java 8, вы можете поместить этот метод в интерфейс IPersistent, если хотите избежать создания класса инструментов.

Возможно, вам понадобится некоторая информация о Foo (или другом объекте IPersistent) в deleteAll. И вы можете использовать силу аннотаций для этой цели!

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
public @interface PersitenceInfo { 
    String info1(); 
} 

Наконец, вы сможете украсить Foo

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

И получить эту информацию в deleteAll через clazz.getAnnotation(PersistenceInfo.class).info1().

+0

Я пытаюсь реализовать это, но я получаю 'null' на' clazz.getAnnotation (PersistenceInfo.class) ' –

+0

@BartFriederichs Извините! Я забыл '@Retention (RententionPolicy.RUNTIME)' в аннотации, чтобы сделать его доступным во время выполнения! Я также добавил '@ Target', чтобы эта аннотация была доступна только для класса, интерфейса или перечисления. – NiziL

+0

Ну, это сработает, но это не то, что ООП, как, Избегайте классов Util/Tools. @Lawrenace Aiello s ответ – Zarathustra

Смежные вопросы