在Java中向构造函数传递标志(或不传递)

在Java中向构造函数传递标志(或不传递),java,constructor,instantiation,flags,enum-flags,Java,Constructor,Instantiation,Flags,Enum Flags,例如,为大致相同的任务使用不同名称的方法是有意义的 open(字符串文件名) createThenOpen(字符串文件名);//首先使用默认内容创建文件,然后处理该文件。 这种命名方法不适用于构造函数。假设构造函数采用如上所述的文件名。我有多种选择来处理这两种情况: 构造函数中的If语句:如果文件不存在,则创建它。这并不好,因为构造函数的行为是隐式的,调用方可能会创建不需要的文件,而不是打开现有文件 向构造函数添加一个标志:MyClass(字符串文件名,布尔值createNew)。不是很好,

例如,为大致相同的任务使用不同名称的方法是有意义的

  • open(字符串文件名)
  • createThenOpen(字符串文件名);//首先使用默认内容创建文件,然后处理该文件。
这种命名方法不适用于构造函数。假设构造函数采用如上所述的文件名。我有多种选择来处理这两种情况:

  • 构造函数中的If语句:如果文件不存在,则创建它。这并不好,因为构造函数的行为是隐式的,调用方可能会创建不需要的文件,而不是打开现有文件
  • 向构造函数添加一个标志:
    MyClass(字符串文件名,布尔值createNew)
    。不是很好,因为像
    MyClass(“hello.txt”,true)
    这样的调用是神秘的
  • 重载,使单个参数始终假定文件存在,并且附加伪参数的存在意味着应创建该文件。这也很难看
  • 添加一个字符串标志,如
    随机访问文件(文件文件,字符串模式)
    中的
    模式是
    “r”
    “rw”
    等。这对我来说很笨重
  • 添加一个类似于
    文件
    复制(路径源、路径目标、复制选项…选项)的
    枚举标记
    。感觉也很笨重
  • 有一个不带参数的构造函数,然后在创建对象后立即调用像上面这样的单独方法。这不太好,因为如果没有使用指定文件中的数据对对象进行实例化,就没有意义了
  • 目前,我似乎更喜欢上面的数字(6),只是在无参数构造函数之后立即调用两个名称不同的方法。我是否忽略了任何选项,或者是否有针对这些场景的“给定”方法

    编辑:正如下面其他人所指出的,当然还有第七个,也许是最明显的选择:

  • 使用工厂方法

  • 让你的构造函数有一长串参数
    受保护
    ,引入许多名为
    createFooWithBar()
    公共静态
    方法,这些方法具有调用你的构造函数的精确参数列表。

    让你的构造函数私有化并添加公共工厂方法。 我认为这是一种非常常见的模式


    另一种模式是“构建器”。使构造函数仅对同一包的类可访问。在同一个包中添加一个生成器(或多个生成器,如果您愿意),该生成器将调用构造函数,并调用构造对象所需的任何其他方法。

    如果不存在,为什么不创建一个子类,通过创建文件扩展行为?对于选项2,make()听起来不是一个很好的构造函数。它意味着与类名相同,那么您的类名是什么?使用子类毫无意义,因为超类和子类将表示完全相同类型的对象。啊!当然可以。使用SO就像为出版物写下一个数学证明:你需要仔细地为他人制定证明,以便看到细节,并发现其缺陷。@使用SO就像写下证明,然后收到“你有一个错误,但我为你解决了”@alamar-我希望评论家或论文也能对你有所帮助。