【问题标题】:Change constructor arguments runtime更改构造函数参数运行时
【发布时间】:2016-09-21 15:12:10
【问题描述】:

您好,我不知道如何实际查找它,但我很好奇,您能否根据您在构造函数中提供的参数更改对象。就像你有一个对象库,它有一个构造函数 public Library(Map books) 或其他东西。如果我创建 Map...new Hashmap,在其中放入 5 个键值,然后将该映射提供给 Library 的构造函数,Library 对象将有一个包含 5 个键值的 hashmap。如果我在哈希图中再插入 2 个键值会发生什么?突然构建的 Library 对象在其映射中是否会有 7 个键值,还是仍然只有最初的 5 个?

【问题讨论】:

  • 传递一个对象数组,这样你可以模仿它,但你仍然需要处理每个元素运行时
  • Java 参数是按值传递的,但对于 Object,该值是一个引用值,因此您可以使用它来修改所指对象。因此,要回答您的问题,它将参考 7 个键的映射。
  • this例子。

标签: java constructor runtime


【解决方案1】:

这取决于构造函数的作用。如果构造函数只是将 Map 存储在实例变量中:

public class Library {
    private final Map<String, String> books;

    public Library(Map<String, String> books) {
        this.books = books;
    }

    public int size() {
        return books.size();
    }

    public static void main(String[] args) {
        Map<String, String> myBooks  = new HashMap<String,String>();
        myBooks.put("Jonathan Swift", "Gullivers Travels");
        myBooks.put("Robert Louis Stevenson", "Treasure Island");
        myBooks.put("William Shakespeare", "Hamlet");
        myBooks.put("J R R Tolkein", "The Hobbit");
        myBooks.put("Mary Shelley", "Frankenstein");
        Library library = new Library(myBooks);
        myBooks.put("J K Rowling", "Harry Potter and the Philosophers stone");
        System.out.println("Library contains" + library.size() + " books");
    }
}

然后库包含对传递给它的映射的引用,它将看到对该映射内容的任何更改。上面的代码应该打印出图书馆有 6 本书。

另一方面,如果构造函数复制地图:

public class Library {
    private final Map<String, String> books;

    public Library(Map<String, String> books) {
        this.books = new HashMap<String, String>(books);
    }

    public int size() {
        return books.size();
    }

    public static void main(String[] args) {
        Map<String, String> myBooks  = new HashMap<String,String>();
        myBooks.put("Jonathan Swift", "Gullivers Travels");
        myBooks.put("Robert Louis Stevenson", "Treasure Island");
        myBooks.put("William Shakespeare", "Hamlet");
        myBooks.put("J R R Tolkein", "The Hobbit");
        myBooks.put("Mary Shelley", "Frankenstein");
        Library library = new Library(myBooks);
        myBooks.put("J K Rowling", "Harry Potter and the Philosophers stone");
        System.out.println("Library contains" + library.size() + " books");
    }
}

那么图书馆有自己的地图副本,不会看到对原始地图的任何更改,所以上面的代码应该打印图书馆里有5本书。

【讨论】:

    【解决方案2】:

    是的,它会的。例如:

    import java.util.Map;
    import java.util.HashMap;
    
    public class HelloWorld{
    
     public static void main(String []args){
        Map<String, String> books = new HashMap();
        books.put("Author1", "Book1");
        books.put("Author2", "Book1");
        Library l1 = new Library(books);
        books.put("Author3", "Book1");
        System.out.println(l1.toString());
     }
    }
    
    class Library {
    private Map<String, String> books;
    
    public Library(Map<String, String> books) {
        this.books = books;
    }
    
    @Override
    public String toString() {
        return books.toString();
    }
    

    }

    输出将是: {Author3=Book1, Author2=Book1, Author1=Book1}

    这是因为 java 不是将对象本身传递给构造函数,而是对该对象的引用。这意味着 main 方法中的书籍地图和图书馆中的书籍地图实际上是一个对象。 如果您不希望图书馆书籍从图书馆类外部更改,您可以根据构造函数输入创建新对象。撒谎:

     public Library(Map<String, String> books) {
        this.books = new HashMap(books);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      相关资源
      最近更新 更多