何时使用参数以及何时使用实例数据?

时间:2013-11-10 17:34:08

标签: java static coding-style instantiation

所以我现在正在编写一个程序,并且我对如何编程它感到矛盾。我有两个选择:

public class Translator {

private Translator(){}; //prevents instantation
/****
  ***Stuff
  ***/

public static String translate(String oldLanguage, String newLanguage, String text){
         //METHOD Code
}

}

public class Translator {

private String oldLanguage;
private String newLanguage;

public Translator(String oldLanguage, String newLanguage){
            this.oldLanguage = oldLanguage;
            this.newLanguage = newLanguage;
}; 
/****
  ***Stuff
  ***/

public String translate(String text){
         //METHOD Code
}

}

我应该使用哪种?为什么?这将是我程序的API端。

另外,作为程序员,您在处理API时会发现更方便吗?为什么?

5 个答案:

答案 0 :(得分:1)

这是一个非常有趣的问题,没有一个最好的答案。从我的头脑中选择的标准主要是:

  • 您打算实例化翻译器并使用相同的新旧语言多次重复使用它吗?
  • 您的译员是否需要在内存中保留一些状态才能翻译,而不必在每次需要翻译时重新加载此状态?
  • 您的翻译是否有其他方法也使用旧语言和新语言?
  • 是否在应用程序的某个地方需要调用翻译器,甚至不需要关心/了解新旧语言是什么,将预先配置的翻译作为参数?
  • 你是否需要能够模拟翻译并将其注入代码的各种其他组件中进行单元测试?

如果这些问题的答案是肯定的,那么应该使用有状态的翻译(即你的第二个选项)。如果答案为否,那么您可以使用第一个选项。

答案 1 :(得分:1)

我更喜欢使用无状态版本的翻译器,但我更喜欢翻译的状态完整版本。原因是,如果你摆脱状态,那么你可以经常摆脱整个类的同步错误,同时将一些重要信息移动到更接近实际使用的位置。想象一下,例如,如果两个语言变量是1000行类的一部分。你想在每次使用时查看它们的设置吗?

我喜欢翻译状态的原因是一般的翻译可以在不知道将要使用哪种语言的情况下存在,如果你丢失了翻译中使用的语言,你不知道该做什么再用它(类似于在数学问题中丢失你的单位)。

对于有状态选项,我更喜欢的版本是,而不是:

   ...
   private String oldLanguage;
   private String newLanguage;

使用:

   ...
   private final String oldLanguage;
   private final String newLanguage;

...而不是像:

   myTranslator.setLanguages("spanish", "english")
   Translated myTranslated = myTranslator.translate(original)

你可以使用:

   Translator spanishEnglish = new Translator("spanish", "english")
   Translated myTranslated = spanishEnglish.translate(original)

答案 2 :(得分:0)

根据面向对象编程标准,类是实体的表示。因此,只有当这些属性是由类表示的实体的属性时,才应将某些内容定义为类的属性。话虽如此,只有在Translator实体具有这些属性的情况下,才能将oldLanguagenewLanguage添加到Translator类。

答案 3 :(得分:0)

我更愿意使用第一个

public class Translator {

    private Translator(){}; //prevents instantation
        /****
        ***Stuff
        ***/

    public static String translate(String oldLanguage, String newLanguage, String text){
             //METHOD Code
    }

}
为什么? 答案为什么我应该实例化一个对象来翻译某些东西,如果我可以直接这样做。

Translator.translate(S,S,S);

答案 4 :(得分:0)

当一个类的方法不能访问该类的任何非静态成员或方法时,它可以(应该?)是静态的。

现在这引出了一个问题,当一个类的成员(字段)应该是静态的时候:

如果类的成员(字段)与定义此类的实例(=对象)的状态相关,则它必须是非静态的。

总而言之,如果某个东西与某个对象的状态相关,那么将其作为实例数据,如果不是(仅与计算相关),则将其作为参数传递给该方法。

除此之外,现在很清楚,如果你想表示一个状态,那么创建一个类的实例才有意义。如果存在零非静态成员,那么您不需要能够创建类的实例。