java - 在其他方法/函数中的构造函数中调用对象

标签 java

我是Java的新手,遇到一种情况,我的构造函数中有一个excel对象,而我必须在函数/方法中调用该对象。
我的代码看起来像

public class Hotel {

Hotel() throws BiffException, IOException {

    FileInputStream configurationExcel=new FileInputStream("C://Users//Rashmi//Desktop//TravalPS_RegregrestionTest1.xls");
    Workbook book = Workbook.getWorkbook(configurationExcel);
    Sheet firstsheet= book.getSheet(0);     
}
public void test(){
        Cell excelcell= firstsheet.getCell(2, 2);//this line is throwing error
}


我想在测试功能中使用首页对象,我该如何实现呢?

最佳答案

您想将firstSheet分配给该类的成员变量,以便可以通过其他方法访问它:

public class Hotel {
    /** Variables defined here are accessible in the entire class */
    private Sheet mFirstSheet;

    Hotel() throws BiffException, IOException {
        /* Variables defined here are only accessible within these curly braces */

        FileInputStream configurationExcel = new FileInputStream("...");
        Workbook book = Workbook.getWorkbook(configurationExcel);
        mFirstSheet = book.getSheet(0);
    }

    public void test() {
        Cell excelcell = mFirstSheet.getCell(2, 2);
    }
}


注意定义和初始化之间的区别。 mFirstSheet在类的主体中定义(在类的花括号内),但在构造函数中初始化。定义变量的位置决定了可从何处访问变量。

关于可访问性的另一点,您的类被定义为公共类,但是构造函数(Hotel() ...)上没有修饰符。在Java中,这默认情况下将其打包为私有(这意味着仅同一包中的其他类,或者如果没有包,则在同一目录中,请参见此构造函数)。这意味着,尽管其他软件包中的类可以看到该类,但它们无法创建该类的新版本。这可能是您的意图,并且有某些用途,但是我猜不是这样,因此您可能也想将构造函数公开:public Hotel() ...

关于范围和可访问性的注释

有了关于范围界定的新发现知识,可能会很想这样做,以便在#justincase中到处都可以访问所有内容。不要这样原因如下:


它污染名称空间

假设您有几种方法可以从工作表中获取一个单元格,但是您将excelcell变量定义为类中的私有字段(与mFirstSheet放在同一位置)。现在,所有与以前完全不同的单元格进行交互的方法都将它们存储在同一变量中。现在,这令您头疼不已,请确保该方法在使用前正确初始化excelcell,否则它将获得其他方法的单元格,因此此变量应在使用该方法的范围内起作用。
它留下了长期存在的参考资料

Java是垃圾收集的,这意味着,当内存不足时,有一个称为垃圾收集器的系统将查找不再具有任何引用附加到它们的对象,并释放与它们关联的内存。离开方法的范围后,定义的变量将不再可用,因此,如果不存在其他对它们的引用,则垃圾收集器可以将其删除。但是,如果您将所有变量都分配为类的私有字段,那么只要类的实例存在,它们就至少存在(因为该实例现在包含对该对象的引用)。

configurationExcel变量就是一个很好的例子。就目前而言,它很可能在您离开构造函数后便被垃圾回收了。这样做很好,因为它包含一个文件指针,而您实际上不想让打开时间超过必要时间(book可能持有对该文件的引用,但由于它的目的,我猜测它可能不会')。但是,如果它是一个私有字段,它将一直存在,直到该类的实例一直未使用时,它的内存就浪费了。
它破坏了封装

除了将私有字段公开之外,情况并非总是如此。您会注意到,当我定义mFirstSheet时,我将其设置为private Sheet。这意味着只能由此类本身(及其内部类和静态上下文)访问。如果将其定义为public Sheet mFirstSheet,那么任何东西都可以访问它,一开始似乎是个好主意,因为它省去了编写一个getter来让程序的其他部分访问它的麻烦。 ,但这不是一个好主意。这意味着您无法控制类的内部状态发生了什么,任何事情都可以代替它:

public class ChaosMonkey() {
    public static void wreakHavoc(Hotel hotel) {
        hotel.mFirstSheet = null;
        /** Havoc wreaked */
    }
}


而且您不知道何时,为何或如何。

(此时您可能在想:如果我确实希望其他类能够修改mFirstSheet,该怎么办。如果这是您的类设计的一部分,则其他类应该能够在不进行任何更改的情况下更改其内部状态。限制,那么这是一个错误的设计,并表明了相关字段不属于该类的事实。

关于java - 在其他方法/函数中的构造函数中调用对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21062007/

相关文章:

java - "No Session found for current thread"更改 session 访问方法后

java - CXF:使用 JAR 文件中的 XSD 并使用相对导入进行架构验证

java - 如何: Docker container running java jar connecting to host mysql server?

java - gwt-maven-插件 : Only generate necessary js files

java - Log4J2:替换参数无法正常工作

类路径中存在 Java 类,但启动失败并出现错误 : Could not find or load main class

java - 集群与复制

java - Jenkins - mvn 未找到

java - 如何从HashMap中获取String键?

java - 显示相对于其他主 JFrame 上的元素的 JFrame