Почему статические методы не могут быть абстрактными в Java - PullRequest
557 голосов
/ 16 декабря 2008

Вопрос в Java, почему я не могу определить абстрактный статический метод? например

abstract class foo {
    abstract void bar( ); // <-- this is ok
    abstract static void bar2(); //<-- this isn't why?
}

Ответы [ 24 ]

0 голосов
/ 22 июня 2015

Согласно Java doc :

Статический метод - это метод, связанный с классом, в котором это определено, а не с любым объектом. Каждый экземпляр класса делится своими статическими методами

В Java 8 наряду с методами по умолчанию в интерфейсе также разрешены статические методы. Это облегчает нам организацию вспомогательных методов в наших библиотеках. Мы можем хранить статические методы, специфичные для интерфейса, в одном интерфейсе, а не в отдельном классе.

Хороший пример этого:

list.sort(ordering);

вместо

Collections.sort(list, ordering);

Другой пример использования статических методов также приведен в doc :

public interface TimeClient {
    // ...
    static public ZoneId getZoneId (String zoneString) {
        try {
            return ZoneId.of(zoneString);
        } catch (DateTimeException e) {
            System.err.println("Invalid time zone: " + zoneString +
                "; using default time zone instead.");
            return ZoneId.systemDefault();
        }
    }

    default public ZonedDateTime getZonedDateTime(String zoneString) {
        return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
    }    
}
0 голосов
/ 01 декабря 2013

Идея наличия абстрактного статического метода заключается в том, что вы не можете использовать этот конкретный абстрактный класс непосредственно для этого метода, но только первая производная будет иметь возможность реализовать этот статический метод (или для обобщений: фактический класс универсальный вы используете).

Таким образом, вы можете создать, например, абстрактный класс sortableObject или даже интерфейс с (авто) абстрактными статическими методами, которые определяют параметры опций сортировки:

public interface SortableObject {
    public [abstract] static String [] getSortableTypes();
    public String getSortableValueByType(String type);
}

Теперь вы можете определить сортируемый объект, который можно отсортировать по основным типам, которые одинаковы для всех этих объектов:

public class MyDataObject implements SortableObject {
    final static String [] SORT_TYPES = {
        "Name","Date of Birth"
    }
    static long newDataIndex = 0L ;

    String fullName ;
    String sortableDate ;
    long dataIndex = -1L ;
    public MyDataObject(String name, int year, int month, int day) {
        if(name == null || name.length() == 0) throw new IllegalArgumentException("Null/empty name not allowed.");
        if(!validateDate(year,month,day)) throw new IllegalArgumentException("Date parameters do not compose a legal date.");
        this.fullName = name ;
        this.sortableDate = MyUtils.createSortableDate(year,month,day);
        this.dataIndex = MyDataObject.newDataIndex++ ;
    }
    public String toString() {
        return ""+this.dataIndex+". "this.fullName+" ("+this.sortableDate+")";
    }

    // override SortableObject 
    public static String [] getSortableTypes() { return SORT_TYPES ; }
    public String getSortableValueByType(String type) {
        int index = MyUtils.getStringArrayIndex(SORT_TYPES, type);
        switch(index) {
             case 0: return this.name ;
             case 1: return this.sortableDate ;
        }
        return toString(); // in the order they were created when compared
    }
}

Теперь вы можете создать

public class SortableList<T extends SortableObject> 

, который может извлекать типы, создавать всплывающее меню, чтобы выбрать тип для сортировки и обрабатывать список, получая данные из этого типа, а также иметь функцию добавления, которая, когда тип сортировки был выбран , может автоматически сортировать новые элементы в. Обратите внимание, что экземпляр SortableList может напрямую обращаться к статическому методу «T»:

String [] MenuItems = T.getSortableTypes();

Проблема с необходимостью использования экземпляра заключается в том, что в SortableList, возможно, еще нет элементов, но уже требуется обеспечить предпочтительную сортировку.

Cheerio, Olaf.

0 голосов
/ 24 июля 2014

Во-первых, ключевой момент об абстрактных классах - Абстрактный класс не может быть создан (см. wiki ). Таким образом, вы не можете создать любой экземпляр абстрактного класса.

Теперь способ, которым java работает со статическими методами, заключается в совместном использовании метода со всеми экземплярами этого класса.

Итак, если вы не можете создать экземпляр класса, у этого класса не может быть абстрактных статических методов, поскольку абстрактный метод требует расширения.

Boom.

0 голосов
/ 22 марта 2014

Вы можете сделать это с интерфейсами в Java 8.

Это официальная документация по этому поводу:

https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

...