【问题标题】:Can variables be used to create object in Java?变量可以用来在Java中创建对象吗?
【发布时间】:2020-09-24 05:44:24
【问题描述】:

我该如何做这样的事情?我想采用像Circle 10 或Rectangle 20 30 这样的命令行参数并创建相应类的对象。

class Circle{
    //Some lines here
}

class Rectangle{
    //Some lines here
}

public class Perimeter{
    public static void main(String[] args) {
        for(int i=0; i< args.length; i++){
            String shape = args[0];
            shape curr_shape = new shape();
            System.out.println(curr_shape.getPerimeter( <arguments> ));
        }
    }
}

【问题讨论】:

  • 这能回答你的问题吗? Create new object from a string in Java
  • 我已经创建了我需要的所有类。我需要使用变量创建这些类的对象。我认为该链接描述了如何使用字符串创建类。

标签: java class oop


【解决方案1】:

您可以使用Class.forName() 和反射来创建实例,就像@Milgo 建议的那样,但我建议创建一个简单的switch/case。您的任务看起来像是一些培训,所以这可能是您的最佳选择。

Object form;
switch (type) {
  case "Circle":
    form = new Circle();
    break;
  case "Rectangle":
    form = new Rectangle();
    break;
}

【讨论】:

  • 另外,你可以有一个抽象基类Form 和一个抽象的getPerimeter() 方法,Circle、Rectangle 等实现。然后将Object form 更改为Form form 并在末尾添加return form.getPerimeter()。
【解决方案2】:

虽然您可以使用反射(即黑暗艺术),但如果所有形状都具有相同的构造函数签名,例如 List&lt;Double&gt;(包括您的示例中的整数),您可以使用最少的代码来完成:

private static Map<String, Function<List<Double>, Shape>> factories = 
    Map.of("Circle", Circle::new, "Rectangle", Rectangle::new); // etc

public static Shape createShape(String input) {
    String[] parts = input.split(" ");
    String name = parts[0];
    List<Double> dimensions = Arrays.stream(parts)
      .skip(1) // skip the name
      .map(Double::parseDouble) // convert String terms to doubles
      .collect(toList());
    return factories.get(name).apply(dimensions); // call constructor
}

interface Shape {
    double getPerimeter();
}

static class Rectangle implements Shape {
    private double height;
    private double width;

    public Rectangle(List<Double> dimensions) {
        height = dimensions.get(0);
        width = dimensions.get(1);
    }

    @Override
    public double getPerimeter() {
        return 2 * (height + width);
    }
}

static class Circle implements Shape {
    double radius;

    public Circle(List<Double> dimensions) {
        radius = dimensions.get(0);
    }

    @Override
    public double getPerimeter() {
        return (double) Math.PI * radius * radius;
    }
}

【讨论】:

  • float?为什么不double?
  • @MCEmperor 很好,改为双倍。不影响概念。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
相关资源
最近更新 更多