Java 从字符串构造对象

Java 从字符串构造对象,java,Java,是否可以在给定字符串、toString方法和类本身的情况下构造对象 例如,我们有一本教科书 class Book { // ... String getTitle() { return title; } String getPubYear() { return pubYear; } void setTitle(String _title) { title = _title; } void

是否可以在给定字符串、toString方法和类本身的情况下构造对象

例如,我们有一本教科书

class Book
{
   // ...

   String getTitle()
   {
      return title;
   }

   String getPubYear()
   {
      return pubYear;
   }

   void setTitle(String _title)
   {
      title = _title;
   }

   void setPubYear(String _pubYear)
   {
      pubYear = _pubYear;
   }

   public String toString(){
      return title+" "+pubYear;

   }
}
如果我们有字符串:

"ExampleTitle 2017"
如何创建具有以下属性的类书实例:

title=ExampleTitle

pubyear=2017
我们可以做到以下几点:

Book book = new Book();
String exampleString = "ExampleTitle 2017";
String[] parts = exampleString.split();
book.setTitle(parts[0]);
book.setPubYear(parts[1]);

但这是冗长的。有更自动的方法吗?

您可以添加一个新的构造函数:

public Book(String s) {
    String[] parts = s.split(" ");
    if (parts.length() == 1) {
        this.title = s;
    } else {
       this.title=parts[0];
       this.pubYear(Integer.parseInt(parts[1]));
    }
}
public class Book {

    public Book(String s, int y) {
        this.title = s;
        this.year = y;
    }
}
您应该自己添加NumberFormatException处理,但我推荐我的解决方案

上面的构造函数将获取一个字符串,将其拆分为一个空格,然后执行您所做的操作。您可以像这样使用它:

Book book = new Book("Example_title 2001");
但这不是最好的办法。您应该使用标准模式,首先提取要设置到书本中的值,然后将它们传递给构造函数

做您想做的事情的好方法是制作另一个构造函数:

public Book(String s) {
    String[] parts = s.split(" ");
    if (parts.length() == 1) {
        this.title = s;
    } else {
       this.title=parts[0];
       this.pubYear(Integer.parseInt(parts[1]));
    }
}
public class Book {

    public Book(String s, int y) {
        this.title = s;
        this.year = y;
    }
}

请将年份字段更改为int或long。只要你不使用罗马数字,年份就不应该是字符串。

你为什么认为它冗长?我不知道你怎么会期望一个自动的解决方案能够理解你的字符串的哪一部分映射到了哪一部分。字符串不应该提供一些可解析的东西,并且允许重新创建对象。如果需要,那么使用XML或JSON封送器/解封器。不是toString。添加一个新构造函数:public BookString title,String year{…}。我不确定这根绳子今年是否合适。