2014-10-27 1 views
2

Я смотрю на определение org.apache.maven.plugin.Mojo:В каком контексте выполняются инструкции в определениях интерфейса Java?

public interface Mojo 
{ 
    String ROLE = Mojo.class.getName(); 
    [...] 
} 

Я потерял. Насколько мне известно, интерфейсы Java представляют собой набор сигнатур методов. Итак, что это за строка, которая выглядит как заявление здесь? Что такое семантика? Например:

  • Когда эта линия получается «выполнена»?
  • В контексте, в котором эта строка работает, что делает Mojo? Каков его тип?
  • В контексте, в котором эта строка работает, что означает Mojo.class? Я предполагаю, что его тип java.lang.Class?
  • В каком контексте я могу прочитать переменную ROLE? Каков синтаксис для этого? Что будет содержать переменная?
  • Могу ли я написать, что ROLE переменная?
+0

'Mojo' является' Mojo', '.class' документирована,' Mojo.ROLE' –

ответ

3

Все поля интерфейса являются неявной общественность, статической и окончательная. Так это же, как написание

public static final String ROLE = Mojo.class.getName(); 

Он определяет константу, что все пользователь интерфейса можно использовать, как и любую другую константу: Mojo.ROLE. Эта строка выполняется, когда интерфейс Mojo инициализируется ClassLoader. Mojo.class - класс Mojo, действительно типа java.lang.Class<Mojo>. Так как пакет класса org.apache.maven.plugin, значение константы будет "org.apache.maven.plugin.Mojo".

Посмотрите here на соответствующий раздел спецификации языка Java.

+0

Спасибо. Таким образом, строка эквивалентна записи 'public static final String ROLE =" org.apache.maven.plugin.Mojo ";'? Похоже, какое-то довольно бессмысленное использование сумасшедшего метапрограммирования ... – jameshfisher

+1

Это не бессмысленно. Если эта константа всегда должна быть именем класса Mojo, она становится короче, делает цель более четкой и позволяет рефакторинг класса (изменить его имя или пакет), не рискуя забыть изменить значение константы. Пока вы еще не привыкли к синтаксису, но это произойдет. –

+0

Я бы сказал, что предварительная обработка во время компиляции будет более подходящей для таких проблем, а не для исполнения во время выполнения, но я отложу. Спасибо за Ваш ответ. – jameshfisher

0

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

public class MyClass implements Mojo{ 
    . 
    . 
    . 
} 

доступ:

public void someMethod(){ 
    System.out.println(MyClass.ROLE) 
} 
0

Все поля в интерфейсе неявно статичны и окончательны. Это отвечает на некоторые из ваших вопросов:

  • Линия запускается во время статического исполнения. Это возможно во время компиляции, возможно, при запуске программы и, возможно, когда загрузчик классов загружает этот класс. Это сложный бизнес, но он аналогичен всем другим статическим полям.
  • Mojo относится к самому интерфейсу, статически. Это сам тип, поэтому он не имеет типа.
  • Mojo.class относится к java.lang.Class Mojo.
  • Вы можете прочитать переменную ROLE в любом классе, который реализует Mojo. Вы можете читать его только статически, например Mojo.ROLE.
  • Нет, поле окончательное, поэтому вы не можете писать на него. Он предназначен только для констант.
0
  • Когда эта линия получить "выполняется"?

Любой член из Interface является static и final по умолчанию, так String ROLE (который effectivly можно рассматривать как

public static final String ROLE 

будет инициализирован, как каждый статический член, когда ClassLoader загружает класс (в первый раз, ссылается класс).

JLS - Loading of Classes and Interfaces


  • В контексте, в котором проходит эта линия, что же Mojo относится? Каков его тип?
  • В контексте, в котором эта строка работает, на что ссылается Mojo.class? Я предполагаю, что его тип - java.lang.Class?

Mojo имеет тип java.lang.Class<Mojo>


  • В каком контексте я могу читать эту переменную роль? Каков синтаксис для этого? Что будет содержать переменная?

Как подразумевается public static final вы можете получить доступ к нему со всех сторон, используя Mojo.ROLE или через классы реализации по ClassName.ROLE. Как Class#getName() говорит в Java документ, он будет содержать полное квалифицированное имя объекта:

org.apache.maven.plugin.Mojo 

  • Могу ли я написать в эту переменную роль?

Нет, вы не можете, потому что это неявное final

JLS - Interfaces