【问题标题】:How to create new instance on interface static method in Java 8?如何在 Java 8 中的接口静态方法上创建新实例?
【发布时间】:2015-08-01 20:02:02
【问题描述】:

我想对接口强制执行一个静态方法,该方法创建一个实现该接口的新实例,用请求的值填充它,然后返回它。

我的问题是如何对接口进行编码,以便在没有实现类时无法调用方法。

例子:

public interface IMemoryCell {

    public static ? memoryCellCreator(int val)
    {
        return ?;           
    }

    public abstract int getVal();

    public abstract void setVal(int val);

}

【问题讨论】:

  • 您不必将方法设为默认值吗? (就像你的问号中缺少的关键字一样)我不确定我是否认为它是这样的。
  • 你的意思是你试图创建一个实现接口的任意类的实例?
  • @DaveNewton 是的,正确的。
  • @jundl77 谢谢,但是 - 不,静态你不需要它,请查看docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html
  • Java 8 允许在接口中使用静态方法。编写一个公共静态工厂方法,实例化一个实现并返回它。

标签: java interface static java-8


【解决方案1】:

这个可行,虽然我很好奇你需要这个的用例:

public interface IMemoryCell {
    static IMemoryCell instance(int val) {
        final IMemoryCell inst = new IMemoryCell() {
            private int v;

            {
                this.v = val;
            }

            @Override
            public int getVal() {
                return this.v;
            }

            @Override
            public void setVal(int val) {
                this.v = val;
            }
        };
        return inst;
    }

    public int getVal();

    public void setVal(int val);
}

【讨论】:

  • OP 正在寻找返回实现接口的类的实例。
  • 你也可以从方法中做return new MemoryCell(val);。当然,假设 MemoryCell 实现了 IMemoryCell。
  • 那么你只能使用一个实现接口的类,这似乎也与 OP 想要的背道而驰。
  • 是的,没错,同意。
  • @yoni 您可能会查看docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html,但将再次定义唯一一个特定实例,但在外部META-INF/services/IMemoryCell 文件中,它更灵活一点,但仍限于一种具体的实现。
【解决方案2】:

我不知道有什么方法可以做到这一点;接口就是这样,接口。

他们不知道谁在实现它们,也不知道如何构造任意类的实例。

如果你可以保证一个默认构造函数,你可以有一个调用this.getClass().newInstance()的默认接口方法,例如,

default Interface1 buildMe() throws (etc...) {
  return getClass().newInstance();
}

但这必须已经在实例上调用,这违背了目的。

【讨论】:

    猜你喜欢
    • 2017-04-26
    • 2021-05-14
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    相关资源
    最近更新 更多