Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在执行小型单类程序时,我应该将所有内容都设置为静态还是在main中实例化自身的副本?_Java - Fatal编程技术网

Java 在执行小型单类程序时,我应该将所有内容都设置为静态还是在main中实例化自身的副本?

Java 在执行小型单类程序时,我应该将所有内容都设置为静态还是在main中实例化自身的副本?,java,Java,当我在课堂上做家庭作业时,如果程序很小,将问题保留在一节课上(很容易随脚本提交),这通常是有益的 对于这些一次性程序,将所有方法和实例变量声明为静态更合理,还是在主方法中声明类本身的实例更合理 例如: A vs B 就我个人而言,我会选择B,这是一个很好的习惯。默认情况下使每个方法都是静态的是一个不好的习惯 过去,这是一个“取决于个人意见”的决定,但随着单元测试的兴起,静态方法的危害往往更大。在接口上不能将方法指定为static,这会使为类创建接口变得困难,从而使类难以模拟/存根进行单元测试。只

当我在课堂上做家庭作业时,如果程序很小,将问题保留在一节课上(很容易随脚本提交),这通常是有益的

对于这些一次性程序,将所有方法和实例变量声明为静态更合理,还是在主方法中声明类本身的实例更合理

例如:

A

vs

B


就我个人而言,我会选择B,这是一个很好的习惯。默认情况下使每个方法都是静态的是一个不好的习惯


过去,这是一个“取决于个人意见”的决定,但随着单元测试的兴起,静态方法的危害往往更大。在接口上不能将方法指定为
static
,这会使为类创建接口变得困难,从而使类难以模拟/存根进行单元测试。

只有在不需要类实例的情况下使用该方法时,才应使用static。静态方法也应该独立于任何实例变量(仅使用局部或静态变量)

这实际上是一个风格问题。
在main中实例化通常比较容易,因为这样以后就不需要一直将所有内容都称为静态的。

我会将这些方法设置为静态的,因为它们不以任何方式依赖于对象的状态。在
数组
集合
类中的所有排序方法都是静态的之后。

对于家庭作业,这实际上是一个品味问题。对于实际项目,您应该实例化该类并将其包装在
try/catch
中,以便在构建该类时出现问题时可以打印完整的堆栈跟踪


Java默认的
printStackTrace()
有时会忽略嵌套的异常,因此您最终会看到“有一个错误,请参阅下一个异常”,但您看不到它。

对于家庭作业,我会养成“按部就班”的习惯。如果不这样做,将来在处理更复杂的任务/项目时,您可能会养成坏习惯并在代码中引入bug。好的实践很早就开始了,当你在任何语言中发展你的技能时,它真的会光芒四射(在我看来,这就是有时“好”程序员和“好”程序员之间的区别所在)


我将它与学校的任何其他科目联系起来;如果你在学习英语(例如),正确拼写单词是有意义的,而不是用互联网上的首字母缩略词来代替它们。

如果你实际上是在使用类作为算法/方法的集合,这些算法/方法作用于外部数据,而不引用作为类特定实例化一部分的任何字段,那么是的,这些方法应该是静态的。这就是静态方法的要点

然而,有许多细微差别使得一些现有答案(即,不要使用静态方法)成为更好的实用建议。例如,如果这些类以后可能用作接口/抽象类的特定实例,则必须删除所有
静态标记。当然,这都是建议——A和B都是合适的答案


如果您的指导老师说只有一个是正确的,那么他/她正在执行其他要求(例如,编码标准以支持以后的重构),而不仅仅是此时此地的设计要求。这些其他要求也是一个学习机会,因此请确保讲师解释原因。

而且“一切都是静态的”是一个坏习惯,事实上应该避免,静态方法必须独立于实例变量-编译器不允许您以其他方式定义它们。这里的观点是java可能会混淆初学者,因为它要求所有函数(方法)都包含在一个类中,即使不需要面向对象(OO)设计的任何功能。OO是一件好事,java在支持它方面做得很好,但并不是到处都能保证……更好的方法是让它们保持静态,但在一个单独的类中,允许“自文档化”,避免名称空间冲突,同时尊重方法的“无需实例”性质。例如,从main()调用assignment12.GetRandomData()或其他合适的类名(比如SortingLib甚至Utils),您能否澄清“按书”在回答中的含义?它从来没有具体说明过,我认为这才是这个问题的真正意义所在。另外,我认为英语中比较好的比喻应该是主动语态和被动语态。这并不是一个是否正确的问题,而是一个风格/设计选择的问题。“按书”实际上只是尽可能遵循标准的面向对象范例。在这种特殊情况下,方法(mergeSort)不定义特定对象的行为,因此我强烈建议使用静态方法。它们确实不属于类的特定实例,而是属于整个类。(虽然……属于一个类的所有方法在这里肯定都有它的缺点……)换句话说,您不应该需要MergeSort对象来排序:P我认为它不是一种风格/设计选择,而是一种“编写其他人可以理解的代码”。
public class MergeSort
{
   public static Scanner input = new Scanner(System.in);

    public static void main(String[] args)
    {
        int[] randData = getRandomData();
        int[] sortedData = mergeSort(randData);
    }

    public static int[] mergeSort(int[] unsortedData)
    {
        // ...
    }

    public static int[] merge(int[] data, int a, int b, int c)
    {
        // ...
    }
}
public class MergeSort  
{  
   public Scanner input = new Scanner(System.in);

    public static void main(String[] args)
    {
        MergeSort ms = new MergeSort();
        int[] randData = ms.getRandomData();
        int[] sortedData = ms.mergeSort(randData);
    }

    public int[] mergeSort(int[] unsortedData)
    {
        // ...
    }

    public int[] merge(int[] data, int a, int b, int c)
    {
        // ...
    }
}