首页 > 解决方案 > 是否有更快/更简单的方法从扫描的输入构造对象

问题描述

想象一下,您想创建一个未知数量的类实例。您决定使用 ArrayList(如果有更好的选择,如果有人能解释这一点,我将非常感激)您希望允许通过系统输入创建类的实例。

import java.util.ArrayList;
import java.util.Scanner;

class MyClass {

    static ArrayList<MyClass> myArrayList = new ArrayList<>();
    int field1;
    int field2;
    int field3;

    public MyClass(int field1, int field2, int field3) {
    // contructor statements
    }

这是问题所在,如果您扫描输入,则无法将它们输入构造函数,因为您需要在其间打印消息然后扫描输入。您必须通过将所有字段的值分配给其他变量来存储它们,如下所示,您也可以在每次扫描它们时将字段设置在新对象的索引处,但这似乎会很慢而且很复杂代码。

    static void createNewInstance() {
    
    Scanner myScanner = new Scanner(System.in);

    System.out.println("Enter field 1");
    int f1 = myScanner.nextInt();
    System.out.println("Enter field 2");
    int f2 = myScanner.nextInt();
    System.out.println("Enter field 3");
    int f3 = myScanner.nextInt();

    myArrayList.add(new MyClass(f1, f2, f3));
    }
}

所以我想知道是否有办法将扫描的输入直接传递给构造函数,似乎将值存储为变量需要一些计算,而且,如果这些变量是原始的,我认为它们会在堆栈中,哪个堆栈具有静态内存分配,因此它们永久存在。在我看来,这不是一个很好的解决方案,但我对程序性能的了解也非常有限,所以我不确定。我猜答案就是使用该解决方案,其他任何解决方案都太复杂了,不值得使用。感谢您的阅读,对不起,我一直在努力用简洁的方式来表达这个问题。

标签: java

解决方案


在“正常”情况下,您永远不会创建这样的对象 - 应用程序接收对象的方式有很多种(从批处理中读取,接收 HTTP 请求,反序列化......)而且我从未见过“在生产中”提示用户“现在给出我是第一个字段的值... ”等和扫描值

似乎将值存储为变量需要一些计算

这根本不是问题 - 在 Java 中创建对象非常快,另外三个基本字段在性能方面根本不相关

不要过度设计这个


推荐阅读