【发布时间】:2020-04-12 06:40:56
【问题描述】:
这是一个关于最佳实践的问题。在采用面向对象的方法时,我想出了三种不同的方法来做同样的事情。在我未经训练的眼中,它们似乎都没有“错误”,但我知道每种语言和风格都有其最佳实践,我想知道这三种方式中的任何一种是否违反了一些我尚未学习的“最佳实践”。
方式一:(先声明,然后在构造函数中赋值)
public class CCipher {
private String alphabet;
private String shiftedAlphabet;
private int mainKey;
public CCipher(int key){
mainKey = key;
alphabet = "abcdefghijklmnopqrstuvwxyz";
shiftedAlphabet = alphabet.substring(mainKey)
+ alphabet.substring(0, mainKey);
}
方式2:(同时声明和赋值)
public class CCipher {
private String alphabet = "abcdefghijklmnopqrstuvwxyz";
private String shiftedAlphabet;
private int mainKey;
public CCipher(int key){
mainKey = key;
shiftedAlphabet = alphabet.substring(mainKey)
+ alphabet.substring(0, mainKey);
}
方式3:(有些东西在非get/set方法中初始化)
public class CCipher {
private String alphabet;
private String shiftedAlphabet;
private int mainKey;
public CCipher(int key){
mainKey = key;
alphabet = "abcdefghijklmnopqrstuvwxyz";
}
public String encrypt(String input){
shiftedAlphabet = alphabet.substring(mainKey)
+ alphabet.substring(0, mainKey);
// ... code to encrypt input ...
}
public String decrypt(String input){
shiftedAlphabet = alphabet.substring(26 - mainKey)
+ alphabet.substring(0, 26 - mainKey);
// ... code to decrypt input
}
}
就我个人而言,对于这个特定的家庭作业,我真的最喜欢第三种方式,因为它符合我要解决的问题的逻辑。但是错了,好吧错了……
【问题讨论】:
-
当
CCipher对象初始化时,您的第三个方法将shiftedAlphabet保留为null;这可能最终会给使用它的人带来问题,并期望该值不是null。其他两个主要是个人喜好。 -
对于第三种方式,
shiftedAlphabet只在分配给它的方法内部使用,因此不需要它是一个字段;最好将其设为局部变量。 -
为什么不将
alphabet = "abcdefghijklmnopqrstuvwxyz";声明为private static final String?以后有可能改吗? -
你需要一个 mainKey 字段吗?除了在构造函数中,它似乎没有在任何地方使用。
-
嗨@NickAth,我怀疑它以后会改变,除非我自发地学习俄语。我还没有了解“final”,尽管我的 IDE 一直在催我使用它。
标签: java oop instance-variables