【问题标题】:Java imitate default parameter in functionJava模仿函数中的默认参数
【发布时间】:2019-04-08 06:41:33
【问题描述】:

我有以下功能:

public BottomSheetBuilder addItem(int id, @StringRes int title, @DrawableRes int icon) {
   return addItem(id, mContext.getString(title), ContextCompat.getDrawable(mContext, icon));
}

public BottomSheetBuilder addItem(int id, @StringRes int title, Drawable icon) {
   return addItem(id, mContext.getString(title), icon);
}

public BottomSheetBuilder addItem(int id, String title, @DrawableRes int icon) {
   return addItem(id, title, ContextCompat.getDrawable(mContext, icon));
}

public BottomSheetBuilder addItem(int id, String title, Drawable icon) {
   mAdapterBuilder.addItem(id, title, icon, mItemTextColor, mItemBackground, mIconTintColor);
   return this;
}

我必须添加第三个布尔类型的参数。

如果这个参数等于true或者什么都没有传递,那么为null,那么它应该添加元素。

如果为false,则不能添加。

例如:

.addItem(0, "0", null)
.addItem(1, "1", null, false)
.addItem(2, "2", null, true)
.addItem(3, "3", null, false)

一些建议?

【问题讨论】:

    标签: java android function methods


    【解决方案1】:

    Java 中没有默认参数。您需要做的是为每个函数创建两个版本 - 一个有 3 个参数,一个有 4 个。第 3 个参数调用第 4 个参数,第 4 个参数的“默认”值。真的没有捷径。

    如果您经常这样做,您可以考虑编写一个注解解析器,该解析器可以查找注解并根据函数上注解的存在自动添加 3 参数版本。但是,如果您知道如何编写注释解析器,那将是几个小时的工作,这是不值得的。

    【讨论】:

      【解决方案2】:

      不幸的是,java 中的方法参数没有默认值。您要么必须声明一个不带此参数的新方法,称其为“兄弟”,如

      public void methodA() {
          methodA(true); // default is true
      }
      
      public void methodA(boolean param) {
          // do stuff ...
      

      或者,从 Java 8 开始,您可以使用 Optional<T> 类作为参数,它可以保存一个值,也可以为空(然后您可以像处理默认值一样处理它)。但是你总是需要调用带有可选参数的方法,即使你想调用默认的Optional.empty()

      我不是Optional 的粉丝,但如果你有很多方法并且不想将它的数量翻倍,也许这个Optional 类对你来说会是一个更好的选择。

      public BottomSheetBuilder addItem(int id, @StringRes int title, @DrawableRes int icon, Optional<Boolean> add)
      

      【讨论】:

      • 如果你打算做可选的事情,你最好只有一个 4 参数版本,因为无论如何你总是会传递 4 个参数。或者传递一个对象并使用 null 来表示“默认”。
      • 确实,这就是为什么我不是它的粉丝,但是你不需要有任何值来调用方法(调用时你不关心参数的值)
      猜你喜欢
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      • 2011-06-11
      • 2016-06-05
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      • 2015-07-08
      相关资源
      最近更新 更多