2013-12-05 3 views
2

У меня есть статический метод, который должен вызывать SportsMenComparator. Но это, как мы все знаем, не допускается. Как статическая функция использует подкласс компаратора? Хотя у меня есть обходные пути, я ищу лучшие практики для этой конкретной проблемы.Как статический метод использует компаратор?

final class SportsMan { 

    private final String name; 
    private final int rank; 
    private final String sport; 

    public SportsMan (String name, int rank, String sport) { 
     this.name = name; 
     this.rank = rank; 
     this.sport = sport; 
    } 

    public String getName() { 
     return name; 
    } 

    public int getRank() { 
     return rank; 
    } 

    public String getSport() { 
     return sport; 
    } 
} 


final class Sport { 

    private final String sport; 
    private final int numberOfPlayers; 

    public Sport(String sport, int numberOfPlayers) { 
     this.sport = sport; 
     this.numberOfPlayers = numberOfPlayers; 
    } 

    public String getSport() { 
     return sport; 
    } 

    public int getNumberOfPlayers() { 
     return numberOfPlayers; 
    } 
} 


public final class Joins { 

    private Joins() {} 



    public class SportsMenComparator implements Comparator<SportsMan> { 
     @Override 
     public int compare(SportsMan s1, SportsMan s2) { 
      return s1.getSport().compareTo(s2.getSport()); 
     } 
    } 



    public static void innerJoinSort(List<SportsMan> sportsMans, List<Sport> sportList) { 
     Collections.sort(sportsMans, new SportsMenComparator()); 

    } 


} 

результаты Eclipse, в следующем сообщении: No enclosing instance of type Joins is accessible где присоединяется это имя объемлющего класса.

+0

Какова ошибка, которую она бросает? Как вы говорите, что его не допустили? – SudoRahul

ответ

3

Но это, как мы все знаем, не допускается. Как статическая функция использует подкласс компаратора?

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

Например:

public static void main(String[] args) { 
      List<String> s =new ArrayList<String>(); 
      s.add(""); // allowed 
     } 

Но

List<String> s =new ArrayList<String>(); 
     public static void main(String[] args) { 
      System.out.println(); 
      s.add(""); // Error: Cannot make a static reference to the non-static field s 
     } 

Edit:

Поскольку вы определили класс компаратор внутри соединения, вам нужно стыки объект для доступа к Comparation внутри

Collections.sort(sportsMans, new Joins().new SportsMenComparator()); 
+1

+1 nice answer sir :) – Keerthivasan

0

можно использовать что-то вроде этого ---

public static boolean someMethod(MyObject obj1, MyObject obj2){ 
    return obj1.compare(obj2); 
} 
0

Почему вы не можете включить параметр функции.

public static void innerJoinSort(List<SportsMan> sportsMans, List<Sport> sportList, Comparator comparator) { 
    Collections.sort(sportsMans, comparator); 
} 
+0

Я могу, но, как сказано, я не искал обходных решений, но решение этой конкретной проблемы – JavaDeveloper

1

Для использования компаратора нет никакой разницы между его использованием статического или нестатического метода. В любом случае должен использоваться экземпляр компаратора.

Сборщик мусора современных JVM очень эффективен при работе с недолговечными объектами. Таким образом, штраф, который должен быть оплачен за использование нового экземпляра (через новый) каждый раз, обычно не является проблемой. Однако, если вы не хотите использовать свежий экземпляру каждый раз, когда я думаю, что лучший вариант был бы добавить статическое поле к вашему SportsMenComparator, содержащему одноэлементный экземпляр компаратора:

public class SportsMenComparator implements Comparator<SportsMan> { 
    public static final SportsMenComparator instance=new SportsMenComparator(); 
    @Override 
    public int compare(SportsMan s1, SportsMan s2) { 
    return s1.getSport().compareTo(s2.getSport()); 
    } 
} 

public static void innerJoinSort(List<SportsMan> sportsMans, List<Sport> sportList) { 
    Collections.sort(sportsMans, SportsMenComparator.instance); 
} 
+0

действительно означало 'public class SportsMenComparator' – JavaDeveloper

+0

Ну, вот что я написал (в строке 1) , Что вы имеете в виду? – ruediste

1

Проблема заключается в том что вы пытаетесь получить доступ к элементу экземпляра (в этом случае это класс, действительно такой же, как и с файлом или методом) в статическом методе, который не связан с экземпляром. Ответ SURESH ATTA прав, но вы также можете сделать свой класс SportsMenComparator статическим, и он будет работать. У меня нет причин связывать ваш компаратор с экземпляром класса Joins.

+0

отметил вашу точку. – JavaDeveloper

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