繁体   English   中英

在 Java 中实现启用/禁用方法的最佳方法是什么?

[英]What is the best approach for implementing enable/disable methods in Java?

在 Java 中,给定一对公共方法 enableFoo 和 disableFoo,它们分别将名为 isEnabledFoo 的布尔字段设置为 true 或 false,该方法是否应该在设置之前检查 Foo 是否已启用? 如果是,是否应该抛出异常? 如果是,应该选中还是不选中? 如果未选中,它应该抛出什么? 非法状态异常?

一个转折:虽然当前的实现只是设置了一个布尔字段,但我故意不将它实现为一个带有布尔参数的 setFoo“setter”方法,因为稍后可能会更改实现以包含副作用(甚至可能不设置字段一点)。 将其保持为 enableFoo/disableFoo 似乎是保证封装的最佳方式。

我应该这样做吗:

public void enableFoo() throws myCheckedException
{
  if (! this.isEnabledFoo)
  {
    this.isEnabledFoo = true;
  }
  // Is this overkill?
  else
  {
    // Foo is already enabled...Should a checked exception be thrown?
    throw new myCheckedException ("Foo is already enabled.");

    // What about an unchecked exception?
    // throw new IllegalStateException ("Foo is already enabled.");
  }
}

或者简单地像这样:

public void enableFoo()
{
  // I guess we don't care if foo is already enabled...
  this.isEnabledFoo = true;
}

甚至:

public void enableFoo()
{
  // Is this just code bloat?
  if (! this.isEnabledFoo)
  {
    this.isEnabledFoo = true;
  }
}

我认为虽然最后两个版本更简单,但它们会隐藏一个可能的错误,即开发人员调用 enableFoo 认为它已被禁用,而实际上它已经被启用(但这真的很重要吗?)。 这里最好的设计是什么?

我真的不认为你的问题有答案。 所有这些似乎都有效,这取决于您正在执行的操作以及操作后对象的一致状态。

例如:我有一个方法可以启用语法突出显示,如果您选择启用它并且它已经启用,您会关心什么。 在这种情况下,您只需设置布尔标志,而不管之前的状态(选项 2)。

另一方面,如果我不只是更改布尔字段,而是执行一些复杂的逻辑,这些逻辑重新运行可能会很昂贵,例如遍历文档的 DOM 并为所有我不想做的正确位置着色再次只是因为有人“重新检查”了启用标志。

像这样的东西:

public void enableHighlighting() {
  if (!isHighlighting) {
    isHighlighting = true;
    colorView();  // very expensive method
  }
}

现在让我们假设您有一种情况,其中双重启用反映了机器的不一致状态(类似于您将使用assert的情况。在这种情况下,您可能想要抛出异常以表示用户做了非法的事情。

例如,假设语法高亮仅影响某些类型的文件,例如 XML 或 Java 代码,并且用户尝试将其应用于 PHP 代码。 现在突出显示已经启用,但沮丧的用户尝试启用它,因为他没有看到任何变化。 在这种情况下,您可能希望向用户打印一条消息,说明已启用突出显示。 在这种情况下,是否发生更改的返回值可能更有意义,但您也可以使用异常。

返回值:

public boolean enableHighlighting() {
  prevState = isHighlighting;
  isHighlighting = true;
  return prevState != isHighlighting; //return true if value changed
}

不。 你为什么要关心? enableFoodisableFoo是非常明确的-一个允许,其他禁用。 无需检查当前状态。

如果你真的想要,你可以返回一个布尔值来指示以前的状态。 你也可以有一个public boolean isEnabled()方法。

没有直接的答案。 这取决于需求。 具体来说你的操作是否是幂等的。

http://en.wikipedia.org/wiki/Idempotence

如果您的程序是多线程的,建议锁定启用和禁用功能,如果锁定不是原子的,检查可能会有所帮助。 否则你不需要担心检查状态。

您可以使用Facet来启用/禁用功能。

免责声明:我是该平台的作者之一

您可以将方面视为应用程序的所有方法。 您可以在运行时启用/禁用方法。

如何整合:

  • Maven 中心获取包
  • 将它添加到 gradle 配置: implementation 'run.facet.agent.java:facet-agent:0.0.8'
  • 创建一个facet.yml
workspaceId: WORKSPACE~ID
name: My-Application
environment: dev
apiKey: API_KEY

注意:您可以从Facet 仪表板中获取这些键

  • 集成完成后,您可以从系统实时启用/禁用方法。 请注意,无需重新部署或重新启动应用程序。

为了让您了解它与其他人提到的功能标志有何不同,您可以认为分面会自动应用于您的应用程序,而不是每次开发功能时都以编程方式声明。

注意:这还不是生产就绪的。 很高兴与您一起解决问题!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM