内部接口?

4

我对Java还比较陌生,不太理解这个结构是什么意思。我知道什么是接口以及它的定义方式,但在这种情况下,我真的不知道。能否告诉我这是什么?

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

    public interface Look {
        String LIST_CONT = "list.cont";
    }
}
2个回答

1
每个接口内部的字段都是隐式的 public、static 和 final。在这种情况下,WebConstants 声明了一个内部接口(public、static 和 final)Framework 和(public、static 和 final)Look,它们还具有一些(public、static 和 final)String 字段。
这是一种(不太常见的)在代码中排序常量的方式,使用这种结构您可以输入:
String action = WebConstants.Framework.ACTION;

String list = WebConstants.Look.LIST_CONT;

这样做的好处是,由于WebConstants是一个接口,您不会意外地实例化它


2
你不能禁止客户端类“实现”常量接口,这是非常糟糕的做法,因为它将编译时实用程序(在没有前缀的情况下访问常量)作为客户端外部接口的一部分。另一方面,类可以被设置为不可实例化(使用私有构造函数,无条件地throw new AssertionError()或类似的方式),因此比接口更好地放置常量。使用import static,根本没有理由使用常量接口。 - gustafc

1

如果你正在寻找类似的解决方案,你可能需要研究一下枚举(enums):

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

    private String display;

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

    public String getDisplay()
    {
        return display;
    }
}

所以你可以使用WebConstants.ACTION.getDisplay()进行调用。

对我来说,拥有常量接口并没有什么意义。更好的做法可能是拥有抽象访问器方法。

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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接