Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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
OOP(Java)-生成对象的最佳方法_Java_Oop - Fatal编程技术网

OOP(Java)-生成对象的最佳方法

OOP(Java)-生成对象的最佳方法,java,oop,Java,Oop,如果我想用随机值生成一个简单对象的Java实例 例如,对于类: class Entity { int id; } 我想添加generate函数,用id的随机值初始化一个新实例 什么是最好的OOP方法?我考虑了两种选择: 要在实体类中创建静态方法,请执行以下操作: class Entity { int id; public static Entity generate(){ Entity e = new Entity (); int rand = Math

如果我想用随机值生成一个简单对象的Java实例

例如,对于类:

class Entity {
    int id;
}
我想添加generate函数,用id的随机值初始化一个新实例

什么是最好的OOP方法?我考虑了两种选择:

  • 要在实体类中创建静态方法,请执行以下操作:

    class Entity {
      int id;
      public static Entity generate(){
          Entity e = new Entity ();
          int rand = MathUtil.generateRandomInt(); // method in util class 
                     in the project.
          e.setId(rand )
          return e;
     }
    }
    
  • 要创建EntityGenerator类,请执行以下操作:

     class EntityGenerator{
         public Entity generate(){
          Entity e = new Entity ();
          int rand = MathUtil.generateRandomInt(); // method in util class 
                     in the project.
          e.setId(rand);
          return e;
        }
    
    }
    

  • 我犹豫什么是更好的选择。

    您只需要创建类的对象。它将自动填充随机数

    import java.util.Random;
    
    public class Entity {
    
      private int id;
    
      public Entity() {
        id = new Random().nextInt(100000);//set the upper limit, it generated numbers between 0 and 99999
      }
    
      public int getId() {
        return id;
      }
    
      public Entity setId(int id) {
        this.id = id;
        return this;
      }
    
    }
    
    或者您可以在类中创建一个静态
    Random()
    对象

    public class Entity {
      private static Random r = new Random();
      private int id;
    
      public Entity() {
        id = r.nextInt(100000);//set the upper limit, it generated numbers between 0 and 99999
      }
    
      public int getId() {
        return id;
      }
    
      public Entity setId(int id) {
        this.id = id;
        return this;
      }
    
    }
    
    希望能有所帮助。

    选项1最好遵循“java中有效的joshua bloch”。你可以在第一章“静态工厂”中找到它。您也不需要新的EntityGenerator来创建实体,因此它将节省内存

    class Entity {
      int id;
      public static Entity generate(){
          Entity e = new Entity ();
          int rand = MathUtil.generateRandomInt(); // method in util class 
                     in the project.
          e.setId(rand )
          return e;
     }
    }
    
    备选案文2: 分离的
    EntityGenerator
    类(实际上是一个工厂)也适用,但也有一些限制

    • public Entity generate()
      将是静态的,与
      public static Entity generate()
      一样
    • 或者您必须使用
      EntityGenerator
      作为单例(即,在整个程序中只创建和使用一个实例)
    不同之处仅在于哪种模式更适合您 (我假设您可能有多个“实体”类。)

    • 在每个类中为自己的类使用静态
      generate
      方法
    • 集中工厂在特殊的
      EntityGenerator
      类中创建所有类型

    只有在构建
    实体
    s需要其他信息时,才真正需要
    实体生成器
    。然后,您可以在创建
    EntityGenerator
    (可能会被视为工厂对象)时提供信息,然后
    EntityGenerator
    可以在需要时将该信息传递给
    generate
    。如果您不需要在创建每个实体时提供相同的信息,我看不出第二个选项有什么好处。遵循JDK模式,您将有一个用于静态工厂的
    实体
    类(cfg
    ExecutorService
    /
    Executors
    集合
    /
    集合
    等)@user2840073将其标记为答案。如果它能解决你的问题。谢谢为什么在setter中返回实体?实际上我使用的是builder模式。它将有助于创建空对象,并使用带点的指令序列设置属性。像object.setId(1.setName(“khalid”).setAge(25);而不是制作一个参数化的构造函数。那没关系,实际上我怀疑:),但提到它会让事情变得更清楚。