2017-02-23 15 views
-1

Пожалуйста, найдите ниже фрагмент кода: класс ПравилоДоступ перекрытый метод частного внутреннего класса с частным конструктору

public class Rules { 

    public static final JarvisFilterRule FILTER = new JarvisFilterRule(); 

    private static class JarvisFilterRule extends RelOptRule { 
     private JarvisFilterRule() { 
      super(operand(Filter.class, operand(Query.class, none()))); 
     } 

     public void onMatch(RelOptRuleCall call) { 
     // do something 
     } 
    } 
} 

класс RelOptRule

public abstract class RelOptRule { 

    /** 
    * Description of rule, must be unique within planner. Default is the name 
    * of the class sans package name, but derived classes are encouraged to 
    * override. 
    */ 
    protected final String description; 
    public abstract void onMatch(RelOptRuleCall call); 
} 

Мой вопрос: Как может Я получаю доступ к методу onMatch() вложенных классов Rules.JarvisFilterRule?

+0

Метод 'onMatch' является методом _instance_, поэтому вы не получаете доступ к методу onMatch() для внутреннего _class_". Вы можете вызвать этот метод на новом экземпляре 'JarvisFilterRule', на который ссылается константа' FILTER'. Просто назовите 'Rules.FILTER.onMatch (...)'. Кроме того, ваш код не компилируется, и ваш вопрос очень неясен. – Seelenvirtuose

+0

до Rules.FILTER, я не получаю никаких ошибок. Но когда я вызываю Rules.FILTER.onMatch (..), я получаю ошибку компиляции «Тип Rules.JarvisFilterRule не отображается». –

ответ

0

Целью ключевого слова private является предотвращение доступа к классам, которые должны использоваться исключительно классом, объявляющим его.

В вашем случае Rules класс определяет JarvisFilterRule быть private внутренний класс с намерением, что его реализация должна быть известна только Rules класса.

Если вы хотите получить доступ к методу JarvisFilterRule::onMatch() внутри другого класса, вам нужно будет заменить private модификатор JarvisFilterRule с public или переместить внутренний класс JarvisFilterRule в отдельный файл и сделать его public класс. Как это:

JarvisFilterRule .Java

public class JarvisFilterRule extends RelOptRule { 
     public JarvisFilterRule() { 
      super(operand(Filter.class, operand(Query.class, none()))); 
     } 

     public void onMatch(RelOptRuleCall call) { 
     // do something 
     } 
    } 

- ИЛИ -

public class Rules { 

    public static final JarvisFilterRule FILTER = new JarvisFilterRule(); 

    public static class JarvisFilterRule extends RelOptRule { 
     private JarvisFilterRule() { 
      super(operand(Filter.class, operand(Query.class, none()))); 
     } 

     public void onMatch(RelOptRuleCall call) { 
     // do something 
     } 
    } 
} 

Надеется, что это помогает!

0

Rules.FILTER.onMatch(...)

JarvisFilterRule не внутренний класс. Внутренний класс в Java - это вложенный класс, который не является статичным.

+0

Спасибо, что указали его. Ректифицированный. –

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