【问题标题】:How to create a Class with multiple constructors that use the same parameter type如何创建具有多个使用相同参数类型的构造函数的类
【发布时间】:2013-10-28 20:00:14
【问题描述】:

我正在尝试做这样的事情:

公共类 Arquivo { 私有文件目录 = null ; 公共 Arquivo(文件目录){ this.directorio = 目录; } 公共 Arquivo(字符串目录){ 这个(新文件(目录)); } 公共 Arquivo(字符串文件名){ 这个(新文件(“./src/Data/”+fileName)); } }

【问题讨论】:

    标签: java design-patterns constructor


    【解决方案1】:

    你不能用构造函数,这是构造函数的限制之一

    是时候开始使用static factory pattern


    另见

    【讨论】:

    • 另外,请考虑如何使用这样一对构造函数。你期望new Arquivo("foo") 会做什么?它会调用哪个构造函数?
    • @ysha 我可以将构造逻辑与 setter 一起包装在我的工厂方法中,或者我会使用 Builder 模式
    • 对不起,这里的“你”是给 OP 的。 :) 我得到的事实是,如果 Java 确实允许两个具有相同签名的构造函数,它会使这些构造函数的用法模棱两可。我为你的答案 +1 了——工厂方法是这里的方法。
    【解决方案2】:

    您不能创建两个接收单个String 参数的构造函数,只能存在一个这样的构造函数。签名之间必须有区别,例如,向其中一个构造函数添加第二个参数。

    或者,您可以创建一个构造函数并在第二个参数中指示它是文件还是目录:

    // isFile == true means it's a file. isFile == false means it's a directory
    public Arquivo(String fileName, boolean isFile) {
        this(new File((isFile ? "./src/Data" : "") + fileName));
    }
    

    【讨论】:

      【解决方案3】:

      构造函数不能这样做

      一个懒惰的解决方案是

      public Arquivo(String s) {}
      
      public Arquivo(String s, boolean b) {}
      

      只是不要使用布尔值

      【讨论】:

      • 有没有办法做类似的事情,但是,使用最资源友好的路径?您提供的解决方案可能更适合这种场合,否则我将不得不在我的项目中更改一些额外的代码。
      • 使用“魔法布尔值”可能真的非常令人困惑。没有预料到这一点的编码人员可能会浪费时间在代码中寻找一个不存在的布尔值,并且可能会假定一个被删除(偶然?谁知道?)而没有文档。
      • 就像你说的without documentation,它本身是不对的。然后我又说a lazy solution,不过我同意你的看法。
      猜你喜欢
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多