Why can't static methods be abstract in Java?

后端 未结 25 2671
不思量自难忘°
不思量自难忘° 2020-11-22 08:34

The question is in Java why can\'t I define an abstract static method? for example

abstract class foo {
    abstract void bar( ); // <-- this is ok
    ab         


        
25条回答
  •  执笔经年
    2020-11-22 08:49

    The idea of having an abstract static method would be that you can't use that particular abstract class directly for that method, but only the first derivative would be allowed to implement that static method (or for generics: the actual class of the generic you use).

    That way, you could create for example a sortableObject abstract class or even interface with (auto-)abstract static methods, which defines the parameters of sort options:

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

    Now you can define a sortable object that can be sorted by the main types which are the same for all these objects:

    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
        }
    }
    

    Now you can create a

    public class SortableList 
    

    that can retrieve the types, build a pop-up menu to select a type to sort on and resort the list by getting the data from that type, as well as hainv an add function that, when a sort type has been selected, can auto-sort new items in. Note that the instance of SortableList can directly access the static method of "T":

    String [] MenuItems = T.getSortableTypes();
    

    The problem with having to use an instance is that the SortableList may not have items yet, but already need to provide the preferred sorting.

    Cheerio, Olaf.

提交回复
热议问题