ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 对象方法调用是否可以与对象实例同时完成?

2019-05-19 13:00:45  阅读:226  来源: 互联网

标签:java this instantiation


我正在尝试使用java类BitSet作为自定义类的字段.我希望该类使用默认的BitSet并设置所有位.

import java.util.BitSet;

public class MyClass {
    private BitSet mask;

    public MyClass() {
        this(new BitSet(4));
        // want to set all bits first
        // something like 
        // this( new BitSet(4).set(0,3) );
    }

    public MyClass(BitSet mask) {
        this.mask = mask;
    }    
}

默认情况下,BitSet构造函数取消设置所有位.所以在我将它作为匿名对象发送之前,我想调用set(int,int)方法来设置所有位.我知道我可以简单地将字段掩码初始化为新的BitSet,然后从那里调用set(int,int)方法.

但是,一般来说我想知道在对象实例化时是否可以访问实例方法?

解决方法:

为什么不编写一个允许BitSet初始化的单独构造函数?使用Java 8,这看起来像这样:

public class MyClass {
  private BitSet mask;
  public MyClass() {
    this(new BitSet(4),(m)->m.set(0,3));
  }
  public MyClass(BitSet mask,Consumer<BitSet> initializer) {
    initializer.accept(mask);
    this.mask = mask;
  }
}

您甚至可以通过引入带有类型参数的静态方法来使其更通用:

public static <T> T initialize(T t,Consumer<T> initializer) {
  initializer.accept(t);
  return t;
} 

在这种情况下,早期的MyClass看起来如下:

public class MyClass {
  private BitSet mask;
  public MyClass() {
    this(initialize(new BitSet(4),(m)->m.set(0,3)));
  }
  public MyClass(BitSet mask) {
    this.mask = mask;
  }
}

UPDATE

还有一种方法,不引入新方法或构造函数:

public class MyClass {
  private BitSet mask;
  public MyClass() {
    this(new BitSet(4) {{ set(0,3); }});
  }
  public MyClass(BitSet mask) {
    this.mask = mask;
  }
}

通过扩展BitSet并添加instance initialization block(即double curly braces)来实例化anonymous class.

标签:java,this,instantiation
来源: https://codeday.me/bug/20190519/1135273.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有