【问题标题】:Where should I put my code in java?我应该把我的代码放在java哪里?
【发布时间】:2015-05-28 04:29:23
【问题描述】:

我有一些代码很耗时,你可以把它当作从磁盘加载数据(但绝对不仅如此)。但是我在初始化时只需要这段代码一次,但它完成了,我可以直接快速地使用一些与之相关的方法。

现在我不知道应该把这段代码放在哪里,这是我的想法: 我把它放在某个A类的构造函数中,然后放在B类中,这需要多次调用A中的某个方法,所以我在B的构造函数中创建了一个A的新实例,这非常理想,因为每次我需要A 的方法,我可以直接访问它,A 的构造函数只调用一次。

但是问题来了,我还有一些其他的类C,它生成了很多B实例(new B()),那么每次C生成一个新的B实例,都会调用A的构造函数,又是这样非常耗时,我该如何组织我的代码以避免这种情况?

请参阅代码以进行说明。

class A{
    public A(){
        some time-consuming code; 
    }
    public void methodInA(){
        some method in A;
    }
}

class B{
    public B(){
        A a = new A();
        for (i=0; i<10000;i++)
            methodInB();
    }
    public void methodInB(){
        methodInA();
    }
}
//so far, everything is perfect, but I have another class C 

class C{
    public C(){
        some code;
    }
    public void methodInC(){
        for (i = 0; i<10000; i++)
            new B();
    }

}

【问题讨论】:

  • 就我个人而言,我会将代码放在你可以使用的某个方法中,这样你可以更好地控制何时调用它,但这就是我
  • 谢谢,假设我把它们放在方法A中,我只需要调用一次(读取和处理另一个方法A的数据),因为它们很耗时,但我需要调用方法B(需要在不同的地方(类)很多次方法A)的数据,如何避免多次调用方法A? @MadProgrammer
  • 有一个类加载和处理数据,但返回数据的结果,您可以从中传递给其他类/方法。有点像工厂模式
  • A 类(或至少其昂贵的磁盘数据)应该被实例化一次。天真地说,您可以使 A 成为单例(或具有静态数据+字段的类),然后 B 不会调用“new A()”而是调用“A.instance()”。说得不那么天真,我会使用 Spring(如果你熟悉 Spring 术语,我会告诉 spring 创建一个类型为“A”的 bean,scope=singleton,并将其注入 B)
  • 谢谢@MadProgrammer,您的建议很有帮助,下面的答案显示了一种方法。

标签: java


【解决方案1】:

方法一:将A类中的方法设为静态,并在静态块中进行初始化。

请参阅此SO answer

class A {
    // if any variable then make them static
    static {
        // some time-consuming code;
    }

    public static void methodInA() {
        // some method in A;
    }
}

class B {
    public B() {
        for (int i = 0; i < 10000; i++)
            methodInB();
    }

    public void methodInB() {
        A.methodInA(); // directly call static method
    }
}

方法 2: 将 A 类设为 singleton。但那是@BalusC 的SO answer 中的not recommended

【讨论】:

【解决方案2】:

所以您已经确定了将“耗时的代码片段”放入类 A 的构造函数的问题。如果耗时的构造函数被频繁调用,那么如果您生成大量 a 类的对象,您将有一个整体耗时的程序。 在您的情况下,例如方法

mehodInC(){ 
    //some code
}

C 类会创建 10000 个新的 B 对象,并且由于每个 B 对象都会在构造函数中自动创建一个 A 对象,因此您最终会调用该耗时的代码片段 10000 次。

现在这显然不是最理想的,我们如何解决这个问题? 如果我是你,我会将该代码片段移动到一个方法中,因为它可以让你更好地控制何时希望调用它。 (让我们调用该方法 methTimeConsuming() 以获得进一步的参数) 它还分离了程序的不同功能。这有助于提高最终代码的整体可读性。

因此,即使您创建了许多对象,也只调用一次耗时的代码的一种方法是:

A myObj = new A();
myObj.methTimeConsuming();
for(int x = 0; x < 9999; x++){ //9999 because you already called it once outside of for-loop
    myObj = newA();
}

显然这是一个非常基本的代码片段,但这个想法可以从那里扩展。

【讨论】:

  • 对不起,当你在循环中调用 new A() 并使用它的方法时,仍然需要对每个 A() 实例进行初始化。
  • 非常抱歉,我想我误解了你的问题。我以为你只需要调用一次耗时的代码片段(在第一次初始化之后),然后就不需要了。那么我的回答显然无济于事。然后静态,如上所述,是要走的路。
  • 你是对的。我没有说得很清楚,对不起我糟糕的英语。无论如何,我真的很感谢你的帮助。
  • 别担心!很高兴你找到了解决方案老兄!我想我们双方可能存在一些语言障碍;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
  • 2020-09-30
相关资源
最近更新 更多