所以我现在正在编写一个程序,并且我对如何编程它感到矛盾。我有两个选择:
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时会发现更方便吗?为什么?
答案 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实体具有这些属性的情况下,才能将oldLanguage
和newLanguage
添加到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)
当一个类的方法不能访问该类的任何非静态成员或方法时,它可以(应该?)是静态的。
现在这引出了一个问题,当一个类的成员(字段)应该是静态的时候:
如果类的成员(字段)与定义此类的实例(=对象)的状态相关,则它必须是非静态的。
总而言之,如果某个东西与某个对象的状态相关,那么将其作为实例数据,如果不是(仅与计算相关),则将其作为参数传递给该方法。
除此之外,现在很清楚,如果你想表示一个状态,那么创建一个类的实例才有意义。如果存在零非静态成员,那么您不需要能够创建类的实例。