Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的静态方法和接口_Java_Static Methods - Fatal编程技术网

Java中的静态方法和接口

Java中的静态方法和接口,java,static-methods,Java,Static Methods,我有一个UserEntity类,它实现了IUserEntity接口 在UserEntity类中,我有一个静态映射: private static Map<IUserEntity.IIdentifiable, IUserEntity> staticUserEntityMap = new HashMap<>(); 在课堂上: public static Collection<IUserEntity> getUsers(){ return staticUs

我有一个
UserEntity
类,它实现了
IUserEntity
接口

UserEntity
类中,我有一个静态映射:

private static Map<IUserEntity.IIdentifiable, IUserEntity> staticUserEntityMap = new HashMap<>();
在课堂上:

public static Collection<IUserEntity> getUsers(){
    return staticUserEntityMap.values();
}
公共静态集合getUsers(){ 返回staticUserEntityMap.values(); } 但是我不能在接口中声明静态方法,也不能在
UserEntity
类中更改方法签名


如何实现这一点?

您可以创建抽象SkeletonUserEntity(或AbstractUserEntity)类,在该类中定义此getUser方法和所有其他通用方法。所有类都必须实现从SkeletonSerentity扩展而来的IUserEntity

您可以创建抽象SkeletonSerentity(或AbstractUserEntity)类,您可以在其中定义此getUser方法和所有其他通用方法。所有类都必须实现从SkeletonSerentity扩展而来的IUserEntity。在Java 8中,您可以在接口中使用默认实现,但我相信这不会解决您的问题。您可以创建一个单独的静态方法,并在getUsers实现中使用类名调用它,而不是更改方法签名。e、 g

创建新方法:

public static Collection<IUserEntity> getUsersStatic() {
   return staticUserEntityMap.values();
}

在Java8中,您可以在接口中使用默认实现,但我相信这不会解决您的问题。您可以创建一个单独的静态方法,并在getUsers实现中使用类名调用它,而不是更改方法签名。e、 g

创建新方法:

public static Collection<IUserEntity> getUsersStatic() {
   return staticUserEntityMap.values();
}
我想请您参考,并且:

除了默认方法外,还可以在中定义静态方法 接口。(静态方法是与 在其中定义而不是使用任何对象的类 类的实例共享其静态方法。)这使它更容易 用于在库中组织帮助器方法;你可以留下 特定于同一接口中的接口的静态方法,而不是 而不是单独上课

但是,您也可以在接口中实现该字段,因为这将允许您实现简单的静态方法。不利的一面是地图将公开。看起来是这样的:

public interface  IUserEntity {
// ...

 static Map<IUserEntity.IIdentifiable, IUserEntity> staticUserEntityMap = new HashMap<>();

 static Collection<IUserEntity> getUsers(){
   return staticUserEntityMap.values();
 }
}
公共接口IUserEntity{
// ...
静态映射staticUserEntityMap=newHashMap();
静态集合getUsers(){
返回staticUserEntityMap.values();
}
}
我建议您参考,并且:

除了默认方法外,还可以在中定义静态方法 接口。(静态方法是与 在其中定义而不是使用任何对象的类 类的实例共享其静态方法。)这使它更容易 用于在库中组织帮助器方法;你可以留下 特定于同一接口中的接口的静态方法,而不是 而不是单独上课

但是,您也可以在接口中实现该字段,因为这将允许您实现简单的静态方法。不利的一面是地图将公开。看起来是这样的:

public interface  IUserEntity {
// ...

 static Map<IUserEntity.IIdentifiable, IUserEntity> staticUserEntityMap = new HashMap<>();

 static Collection<IUserEntity> getUsers(){
   return staticUserEntityMap.values();
 }
}
公共接口IUserEntity{
// ...
静态映射staticUserEntityMap=newHashMap();
静态集合getUsers(){
返回staticUserEntityMap.values();
}
}

public Collection getUsers(){return staticUserEntityMap.values();}有什么问题?如果不能更改任何签名,只需编写一个调用静态方法的非静态方法。接口不能有没有方法体的静态方法。就这样。一般来说,接口和静态不能很好地协同工作,这是有道理的。另外,您可能想看看(Java 8允许在接口中使用静态方法)。@Gaël但不是没有实现,对吗?
public Collection getUsers(){return staticUserEntityMap.values();}
如果不能更改任何签名,只需编写一个调用静态方法的非静态方法。没有方法体,接口就不能有静态方法。就这样。一般来说,接口和静态不能很好地协同工作,这是有道理的。另外,您可能想看看(Java 8允许在接口中使用静态方法)。@Gaël但不是没有实现,对吗?Huummm,如果我想实现这些,那么我必须对所有CRUD方法都这样做?每个UserEntity对象都可以访问这些“静态”方法,这还不错?Huummm,如果我想实现这些方法,那么我必须对所有CRUD方法都这样做?每个UserEntity对象都可以访问这些“静态”方法,这还不错?好的,谢谢,我认为这是一个更好的结构概念。没有办法让staticMap受保护或私有?好的,谢谢,我认为这是一个更好的结构概念。没有办法让staticMap受保护或私有?