2009-09-26 7 views
4

Je suis assez nouveau à Java et je ne comprends pas quelle est cette structure. Je sais ce qu'est une interface et comment est défini, mais dans ce cas, je ne sais vraiment pas. Pourriez-vous dire de quoi il s'agit?Interfaces internes?

public interface WebConstants { 
    public interface Framework { 
     String ACTION = "action"; 
    } 

    public interface Look { 
     String LIST_CONT = "list.cont"; 
    } 
} 

Répondre

1

Chaque champ à l'intérieur d'une interface est implicitement public, statique et final. Dans ce cas, WebConstants déclare une interface interne (publique, statique et finale) Framework et (publique, statique et finale) Look qui ont également des champs String (publics, statiques et définitifs).

Ceci est un (pas très commun) façon de commander des constantes dans votre code, avec cette structure, vous pouvez taper:

String action = WebConstants.Framework.ACTION; 

String list = WebConstants.Look.LIST_CONT; 

L'avantage est que depuis le WebConstants est une interface vous ne pouvez pas accidentellement instancier

+2

Vous ne pouvez pas interdire les catégories de clients de « mettre en œuvre » une interface constante, ce qui est très mauvaise pratique car il rend un utilitaire de compilation (accès aux constantes sans les préfixer) partie de l'interface externe du client. Les classes, d'un autre côté, peuvent être rendues instables (avec des constructeurs privés qui lancent inconditionnellement une nouvelle AssertionError() ou quelque chose comme ça), et sont donc de meilleures alternatives pour placer des constantes dans des interfaces. Avec 'import static', il n'y a aucune raison d'utiliser des interfaces constantes. – gustafc

+0

@gustafc Je suis totalement d'accord –

1

vous voudrez peut-être regarder dans énumérations si vous cherchez à l'aide d'une solution similaire:

public enum WebConstants 
{ 
    ACTION("action"), LIST_COUNT("list.count"); 

    private String display; 

    private WebConstants(String display) 
    { 
     this.display = display; 
    } 

    public String getDisplay() 
    { 
     return display; 
    } 
} 

donc vous pouvez l'utiliser appeler WebConstants.ACTION.getDisplay(). Avoir une interface de constantes n'a vraiment aucun sens pour moi. Une meilleure façon de faire pourrait être d'avoir des méthodes d'accès abstraites.

public interface ActionAware 
{ 
    public String getAction(); 
} 

public interface ListCountAware 
{ 
    public String getListCount(); 
} 

public abstract class AbstractUseCase implements ActionAware, ListCountAware 
{ 

    public void doSomething() 
    { 
     String action = getAction(); 
     String listCount = getListCount(); 
    } 

} 

public final class SpecificUseCase extends AbstractUseCase 
{ 
    public final static String ACTION = "specific.action"; 
    public final static String LIST_COUNT = "specific.list.count"; 

    public String getListCount() 
    { 
     return LIST_COUNT; 
    } 

    public String getAction() 
    { 
     return ACTION; 
    } 

    // other methods 

}