Java 如何在实现接口的所有类中设计通用静态方法

Java 如何在实现接口的所有类中设计通用静态方法,java,inheritance,interface,static,abstract,Java,Inheritance,Interface,Static,Abstract,我有一个名为关系的接口,由类基本关系实现,并由子类(例如父子女,兄弟姐妹,配偶)扩展。在开发代码时,我意识到我经常需要一种方法,该方法采用关系的字符串表示来创建它。例如: public class ParentChild implements Relation extends BasicRelation { // e.g. "Jack is Emily's father. Jill is her mother." will return the list // <ParentCh

我有一个名为
关系
的接口,由类
基本关系
实现,并由子类(例如
父子女
兄弟姐妹
配偶
)扩展。在开发代码时,我意识到我经常需要一种方法,该方法采用关系的
字符串
表示来创建它。例如:

public class ParentChild implements Relation extends BasicRelation {

  // e.g. "Jack is Emily's father. Jill is her mother." will return the list
  // <ParentChild(Jack, Emily), ParentChild(Jill, Emily)>
  static List<ParentChild> fromSentence(String s) {
    ...
  }
}
公共类ParentChild实现关系扩展基本关联{
//例如,“杰克是艾米丽的父亲,吉尔是她的母亲。”将返回列表
// 
来自句子的静态列表(字符串s){
...
}
}
现在,由于我发现自己在每个类中都需要这个方法(
fromstation(String)
),除了在
BasicRelation
中之外,我想将它向上移动。问题是该方法的内部细节依赖于子类,因此我不能将其作为接口
关系
或超类
基本关系
中的
静态
方法

不幸的是,在Java中,也不可能有
静态抽象
方法


有没有办法确保
基本关系的每个子类
(或者实现
关系的每个类
)都实现
fromstation(String)
?如果没有,我应该用完全不同的方式来设计它吗?我猜最后一个问题与其说是一个问题,不如说是一个设计建议的请求。

为什么静态方法需要在接口中?是什么阻止了你拥有一个“实用”类和方法

public class RelationUtility {
    public static BasicRelation relationFactory(String asString) {
        ....
    }
}

作为一个静态方法,除了访问私有成员之外,没有其他原因,这也可以通过对这些成员的“默认”权限来实现。…

您可以尝试将BasicRelation类设置为抽象类,并使用abstract From句子(…)方法。这将要求ParentChild类重写并实现FromSequence方法,因为如果不实现FromSequence()就无法为ParentChild创建对象

公共抽象类基本关系扩展关系(){
来自句子的公共摘要列表(字符串s);
}
公共类ParentChild实现关系扩展基本关系{
fromstation(){
//parentChild类的实现
}

}如果我理解正确。。。你可以尝试这样的方法

public class BasicRelation {

    public abstract List<ParentChild> fromSentenceInSubclass(s);

    public List<ParentChild> fromSentence(String s){
        fromSentenceInSubclass(s);
    }
}
公共类基本关系{
B类句子的公共摘要列表;
公共列表fromstation(字符串s){
来自B类的句子;
}
}
然后你可以:

public class SubclassRelation extends BasicRelation {

    public List<ParentChild> fromSentenceInSubclass(s){
        // do subclass relation stuff
    }

}
公共类子类关系扩展了基本关系{
类中句子的公共列表{
//做子类关系的事情
}
}
您可能需要稍微更改代码,并添加一些泛型,以使其按您想要的方式发生。
Sotirios Delimanolis工厂建议也可能是一个选项。

您可以让抽象类BasicRelation包含引发异常的静态方法。这样,当您使用静态方法时,您将被迫覆盖(阴影)子类中的静态方法

比如:

public abstract class BasicRelation {
    public static List<..> fromSentence(String s) {
        throw new RuntimeException();
    }
}
公共抽象类基本关系{
来自句子的公共静态列表(字符串s){
抛出新的RuntimeException();
}
}

不,没有办法强制实现
静态
方法。为什么它需要是静态的?这里最好使用某种工厂。或者你可以使用其他类和静态方法,比如fromstation(String,Relation)?这些子类特有的事情应该由子类通过多态性来完成。或者查看访问者模式。但是静态方法不能是抽象的。从本质上说,我的整个困境就是这样开始的。我希望我的方法保持静态,因为它独立于类实例;事实上,它用于生成实例列表。您建议的两种方法都适用于非静态方法。但是我想保持这个方法是静态的,因为调用它是为了生成一系列子类实例,而这个方法本身是独立于实例的。。。不确定这是否是一个“设计智慧”的好主意,但肯定是一个有趣的方法!
public abstract class BasicRelation {
    public static List<..> fromSentence(String s) {
        throw new RuntimeException();
    }
}