Java:对重复的代码段使用静态方法

时间:2015-03-14 19:53:52

标签: java oop methods static

所以我正在学习Java(喘气打赌你可能从来没有猜到过),今天我非常注重确保我正确使用静态方法。

我现在的大练习计划是一个客户经理计划,我调整并添加,因为我学习了越来越多的概念。其中一个组成部分是打印出添加到系统中的所有帐户的列表。因为这个列表不止一次被召唤,所以我创建了一个静态方法,可以调用它来生成它,并将它放在代码中的main方法之上。

我的问题是:我应该这样做吗?为重复的代码部分创建这样的方法是一个好主意/良好的编程礼仪吗?如果两者的答案都是肯定的,我应该把它变成静态方法吗?

这是我正在谈论的静态方法的代码:

/**
 * accountList() method displays a list of all accounts currently loaded into the program
 */
public static void accountList(){
    System.out.println("     ACCOUNT LIST");
    System.out.println("NUMBER      INFORMATION");
    for(int num = 0; num < accountArray.size(); num++){
        System.out.println("  " + (num + 1) + "         " + accountArray.get(num).getAccountName()
                         + " : " + moneyFormat.format(accountArray.get(num).getValue()) + " "
                         + accountArray.get(num).getCurrencyType());
    }
    listMax = accountArray.size();
}

然后在下面这将是我的main()方法,并且在我的main中定期调用此方法来生成帐户列表:

public static void main(String[] args){
    accountList(); //example of how I would invoke this method
}

那么,我有没有弄清楚这个?我正确使用这个吗?感谢。

PS。我的accountList()方法与我的main()方法在同一个类中,这就是为什么之前没有类名。这也是我问的原因,因为我知道术语“静态”的主要目的之一是它可以从另一个类轻松访问,所以我不确定它是否需要是静态的,如果它在同一个类。

4 个答案:

答案 0 :(得分:2)

Don't repeat yourself (DRY)是一个被广泛接受的原则和良好实践,并且创建代码的方法本来是重复的,这是最简单和最明显的形式。

(在某些语言/上下文中,人们暗示了方法调用的潜在开销及其对性能的影响。事实上,内联方法是编译器常用的优化方法。但是现代编译器(特别是Java虚拟机的即时编译器)在适当时自动执行此操作)


Whether helper methods should be static已经在其他地方讨论过了。

我的经验法则是:只要方法 可以是静态的,那么 应该是静态的。

更具差异化的视图:当方法不修改实例字段时(即,当它不能在可变状态 上运行时) >),但是只对它的参数进行操作并返回一个结果(在这个意义上是一个“function”),当它不应该涉及任何形式的多态时(意思是它)不应该超载),那么通常应该static(可能需要在这里考虑单元测试的各个方面,但现在可能导致太多了)


关于您的具体示例:

这里有一个不同的问题:accountArray显然是一个静态字段,以及listMax变量。而静态(非最终的,可变的)字段通常是一个可怕的想法。您应明确对此进行审核,并尝试确保您没有描述static个字段。

如果您这样做,您的方法仍然可以是静态的,并接收accountArray作为参数:

public static void accountList(List<Account> accountArray){
    System.out.println("     ACCOUNT LIST");
    ...
}

但是,在这种形式下,它会违反另一种最佳做法,即Separation of Concerns。该方法做了两件事:

  • 它会创建帐户的字符串表示
  • 将此字符串打印到控制台

然后您可以将其拆分为两个或三个其他方法。根据缩进的用法,例如,这些可能是

public static String createAccountInfoString(List<Account> accounts) {...}

public static void printAccountInfo(List<Account> accounts, PrintStream ps) {
    ps.println(createAccountInfoString(accounts));
}

public static void printAccountInfo(List<Account> accounts) {
    printAccountInfo(accounts, System.out);
}

(请注意,方法名称表示方法执行。类似accountList的方法名称不会告诉您任何内容!)。


然而,正如其他人所指出的:过度使用静态方法并传递信息可能是不能正确使用面向对象概念的标志。你没有准确地描述你要在那里建模的东西。但是,根据关键字,您可能需要考虑将帐户列表封装在类中,例如class AccountList,其中包括将帐户列表打印到PrintStream的方法,如System.out 1}}。

答案 1 :(得分:1)

类的静态成员(即变量,方法)与类的实例/对象无关/不相关。可以在不创建类的对象的情况下访问它们。

使用静态方法的一般规则是 - &#34;问问自己一个类的属性或方法应该适用于所有类的实例&#34;。如果答案是肯定的,那么您可以使用静态成员。

考虑以下示例 -

public class Student{
    private int noOfStudent;
    .......

} 

现在您有Student类型。在这种情况下,您可以考虑制作noOfStudent属性static。因为这不是Student本身的属性。因为班级的所有学生都应该共享noOfStudent的相同属性。

您可以找到更多解释here

希望它会有所帮助。
非常感谢。

答案 2 :(得分:1)

这是一个静态方法。来自同一个类的静态方法,您可以只调用没有类名,但是从另一个类调用静态方法,您必须使用类名调用。例如,如果在名为Class1的类中有一个名为method1的静态方法,并且您尝试在另一个名为Class2的类中调用该方法,则必须调用此方法:

Class1.method1();

如果您只使用method1(),它会显示为错误,它会告诉您它无法找到该方法,因为它只搜索您所在的课程对于该方法,它并没有找到它。您必须放置类名Class1,因此它知道要在Class1中搜索方法,而不是您所在的类。

至于你是否应该使用静态方法,这实际上取决于你的偏好。你知道静态方法和非静态方法之间的区别吗?我现在就给你一些基础知识。如果您有更多问题,可以提问。

好。只有在方法所在的类之外创建一个对象时,才能调用非静态方法。这就是你创建一个对象的方法:

(CLASS NAME)(OBJECT NAME) = new (CONSTRUCTOR NAME)();

构造函数的名称与类名相同。当你调用方法时,你会放(OBJECT NAME).METHOD NAME();打电话给它。至于静态方法,我已经告诉过你如何调用它。所以。还有问题吗?

答案 3 :(得分:1)

使用静态方法可以记住程序编程。实际上,如果使用静态方法,则不能使用OOP原则,例如多态。

首先,目标是打印列表的方法可能会改变程序状态,这是不好的。然后,将来您可能想要更改列表的打印方式。比方说,你想在文件中打印它。如果您的ar使用静态方法,您将如何更改程序以满足此新要求?

尝试考虑更多OO,并在开始时尝试将您的代码放入专用类(即Printer)。然后,您可以从该类中提取接口,最后尝试应用一些设计模式,例如策略模式模板方法模式。< / p>