相关疑难解决方法(0)

为什么我不能在Java接口中定义静态方法?

这是一个例子:

public interface IXMLizable<T>
{
  static T newInstanceFromXML(Element e);
  Element toXMLElement();
}
Run Code Online (Sandbox Code Playgroud)

当然这不会奏效.但为什么不呢?

其中一个可能的问题是,当您致电时会发生什么:

IXMLizable.newInstanceFromXML(e);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我认为它应该只调用一个空方法(即{}).所有子类都将被强制实现静态方法,因此在调用静态方法时它们都会很好.那么为什么这不可能呢?

编辑:我想我正在寻找比"因为这就是Java的方式"更深层次的答案.

是否有一个特殊的技术原因导致静态方法无法被覆盖?也就是说,为什么Java的设计者决定使实例方法可覆盖但不是静态方法?

编辑:我的设计的问题是我正在尝试使用接口来强制执行编码约定.

也就是说,界面的目标是双重的:

  1. 我希望IXMLizable接口允许我将实现它的类转换为XML元素(使用多态,工作正常).

  2. 如果有人想要创建一个实现IXMLizable接口的类的新实例,他们将始终知道将有一个newInstanceFromXML(Element e)静态构造函数.

除了在界面中添加评论之外,还有其他方法可以确保这一点吗?

编辑: 从Java 8开始,接口中现在允许使用静态方法.

java static-methods interface

480
推荐指数
10
解决办法
33万
查看次数

接口上用于强制一致性的静态方法的替代方法

在Java中,我希望能够定义标记接口,强制实现提供静态方法.例如,对于简单的文本序列化/反序列化,我希望能够定义一个看起来像这样的接口:

public interface TextTransformable<T>{

  public static T fromText(String text);

  public String toText();
Run Code Online (Sandbox Code Playgroud)

由于Java中的接口不能包含静态方法(如许多其他帖子/线程中所述:此处,此处,此处此代码不起作用.

然而,我正在寻找的是表达相同意图的一些合理范例,即对称方法,其中一个是静态的,并由编译器强制执行.现在我们能想到的最好的是某种静态工厂对象或通用工厂,这两者都不是真正令人满意的.

注意:在我们的例子中,我们的主要用例是我们有许多很多"值对象"类型 - 枚举或其他具有有限数量值的对象,通常不会超出其值,并且我们解析/ de -parse数秒钟的时间,所以实际上关心重用实例(如Float,Integer等)及其对内存消耗的影响/ gc

有什么想法吗?

编辑1:为了消除一些混乱 - 我们有许多不同的对象适合这种模式 - 实际上我们正试图为具有2个语义的调用者提出一些优雅的东西:

  • 作为合同的接口 - 访问的统一性(例如TextTransformable作为一种能力)
  • 需要通过子类/实现来实现(例如,强制它们实现自己的转换

就我们对Flyweight,Factories的看法而言 - 它们都是我们考虑过的选项,我们真的试图看看我们是否能找到更优雅的东西,而不是依靠JavaDoc说"实现工厂并委托调用它,或按惯例在XXX地点公开"

java oop interface

28
推荐指数
1
解决办法
2万
查看次数

在java 8中,为什么不能调用当前类正在实现的接口静态方法

我最近正在玩Java 8的新功能并观察到一个有趣的行为:

这没关系:

Class A { static void staticMethodInA() {println();} }
Class B extends A {}

B.staticMethodInA();
Run Code Online (Sandbox Code Playgroud)

这会导致以下错误:静态方法只能在包含接口类时调用.

interface A { static void staticMethodInA() {println();} }
Class B implements A {}

B.staticMethodInA(); // from here IntelliJ complaints..
Run Code Online (Sandbox Code Playgroud)

有人能告诉我为什么Java 8的设计者会选择以不同的方式对待上述两种情况吗?

static interface java-8

21
推荐指数
1
解决办法
1万
查看次数

为什么允许在接口内声明静态类?

public interface I1
{
static class Test{}
}
Run Code Online (Sandbox Code Playgroud)

为什么Java允许用Interface编写类?

在接口中编写静态类是个好主意吗?我们可以有效使用它的任何例子吗?

java oop static

6
推荐指数
0
解决办法
197
查看次数

Java接口,创建者模式和"getInstance()"方法或等效方法

我想首先提一下,我的问题源于Java中的接口不允许静态方法.有关SO的原因的讨论(例如,这里).所以不要纠缠于此.我正在寻找一种方法让我的界面创建自己的实例(而不是它的实现)并返回它.尽管使用了Singleton模式,Factory和AbstractFactory模式,我仍然无法实现我的目标.

详细说明我正在尝试的内容 - 这是我的界面:

public interface NoteDataStore {
    public boolean deleteNote(long noteId);
    public boolean addNote(Note note);
    public List<Note> listNotes();
    public boolean editNote(long noteId, Note note);
    public List<Note> search(String searchString);
}
Run Code Online (Sandbox Code Playgroud)

这是我的业务逻辑层:

public class BusinessLogicLayer {

    public BusinessLogicLayer(){
        /*
         * GOAL: To get an instance of NoteDataStore here,
         *  without being aware of the implementation class.
         */
    }

}
Run Code Online (Sandbox Code Playgroud)

我尝试使用像这样的工厂模式:

public interface NoteDataStoreFactory {
    public NoteDataStore getDataStoreInstance();
}

public class NoteDataStoreFactoryImpl implements NoteDataStoreFactory{
    public NoteDataStore getDataStoreInstance(){
        return NoteDataStoreImpl.getInstance();
        /* …
Run Code Online (Sandbox Code Playgroud)

java design-patterns abstract-factory

5
推荐指数
2
解决办法
5544
查看次数

Java中的抽象静态工厂方法[getInstance()]?

当然,以下内容在Java中不起作用(没有抽象的静态方法)......

public abstract class Animal {
    public abstract static Animal getInstance(byte[] b);
}

public class Dog extends Animal {
    @Override
    public static Dog getInstance(byte[] b) {
        // Woof.
        return new Dog(...);
    }
}

public class Cat extends Animal {
    @Override
    public static Cat getInstance(byte[] b) {
        // Meow.
        return new Cat(...);
    }
}
Run Code Online (Sandbox Code Playgroud)

要求Animal类具有getInstance实例化自身的静态方法的正确方法是什么?这种方法应该是静态的; 一个"正常"的抽象方法在这里没有意义.

java abstract-class static-methods factory

3
推荐指数
1
解决办法
4239
查看次数