java - 克服 super 上的重复方法静态引用

标签 java inheritance

我们都知道,在 Java 中,如果在 Abstract 类中声明一个 static 方法,该方法将属于 Abstract 类,而不是它的 child 。 (没有抽象静态)

我有一个简单的数据库系统,它有一个Abstract模型类:

public abstract class Model<T> {

     // WON'T WORK (unfortunately I can't use abstract static)
     public static T find(int id) {
          ...
     }

}

如您所见,我无法在该类上创建返回泛型的静态方法,因为该方法不是继承的,因此它属于抽象类。

解决方法是在抽象类上创建 protected 方法,然后在其每个子类上创建静态方法:

public abstract class Model<T> {

     protected T find(int id) {
          ...
     }

}

public class User extends Model {

     public static User find(int id) {
           User dummy = new User();
           return (User) dummy.find(id);
     }
}

我觉得有更好的方法可以做到这一点。

有什么想法吗?

最佳答案

我可以想到两种可能的选择,尽管其中一种有点麻烦。第一个是 Model<T>一个普通的类并添加一个静态方法来获取如下所示的模型:

//I do not know how you want to do the user class, I just made it take the models class
private static final Model<User> MODEL = new Model<User>(User.class);
public static Model<User> model() {
    return MODEL;
}

你可以这样使用它:User.model().find(id)

另一个选择是向类中添加一个公共(public)静态变量和 static导入该变量以调用其上的方法,就好像它是类而不是 Model实例。例如:

public class User {
    public static Model<User> User = new Model<User>(User.class);
}

使用 static import my.package.User.User; 导入它将允许您使用 User user = User.find(id);第一个User在哪里是类名,第二个 User是静态变量。

否则,您将不得不将静态方法放入每个类中,因为不幸的是您无法继承或覆盖它们。

关于java - 克服 super 上的重复方法静态引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27897439/

相关文章:

java - 字长频率

flutter - 如何根据dartlang中的扩展类设置类型定义

Java - 父类(super class)(继承)与父类(无继承)

JavaFx 在 FXML 中包含自定义组件

java - 使用另一种继承方法将变量传递到方法中

c++ - 我应该如何决定是否构建 "protected interface"?

java - 使用按钮标签,我可以自定义按钮吗?

java - Spring - java.io.FileNotFoundException : class path resource cannot be opened because it does not exist

Java 日历网格布局

java - Hibernate:hbm2ddl 属性值,创建删除总是删除架构,即使没有显式 SessionFactory 关闭?