这个问题起初可能显得愚蠢,但在与不同的人合作之后,我看到每个人似乎都有自己的,不同的知识,所以这是我的问题。
所以现在我想知道最好的方法是什么,以及为什么(“为什么”对我来说更重要):
我想知道编写Java代码的两种方法:
您是否在类实例中使用this.name
,name
或getName()
来调用变量?
public class MyClass {
private String someStr;
private int someNumber;
private Integer someOtherNumber; // int, Integer ? which one to choose ?
public MyClass(String someStr, int someNumber, int someOtherNumber) { // int someNumber ? Integer someNumber ? why ?
this.someStr = someStr; // Here, it's clearly this.{name} = {name} because of the variable name conflict
this.someNumber = someNumber;
this.someOtherNumber = someOtherNumber;
}
public int someMethod(boolean first) { // Boolean ? boolean ?
if (first) {
return someNumber;
} else {
return this.someOtherNumber; // this.{name} ? just {name} or even this.get{name}() or get{name}() ? (supposing getters exists)
}
}
}
我希望有人能为我提供一个很好的解释,告诉我使用哪个来编写更好的代码。
答案 0 :(得分:4)
您是否总是传递Object或者您是否可以传递原始数据类型?
您不能传递Object,只能传递对象的引用。您可以传递原始数据。
您是否在类实例中使用this.name,name或getName()调用变量?
我不会让它变得比我需要的更复杂,除非它与局部变量冲突或我的getName()
做了一些特别的事情,但这是一种风格问题。
答案 1 :(得分:2)
您是否总是传递Object或者您是否可以传递原始数据类型?
您可以根据需要将基元或引用传递给对象。
你是否在你的内部使用this.name,name或getName()调用变量 类实例?
this
用于指代当前对象。如果存在冲突的变量名称并且您想要区分对象变量和局部变量,则使用this
。
你似乎对原语和Wrapper类感到困惑。包装类提供了实用程序方法,特别适用于集合。
答案 2 :(得分:1)
您是否总是传递Object或者您是否可以传递原始数据类型?
public int someMethod(boolean first) { // Boolean ? boolean ?
}
在以下示例中,您可以成功传递boolean
和Boolean
。在Java中,这称为Autoboxing。
N.B。请注意,因为传递对象时可能是null
!
你是否在你的内部使用this.name,name或getName()调用变量 类实例?
取决于。如果name
是类成员变量,如果当前作用域中没有任何具有相同名称的其他变量,则可以使用name
访问它。在这种情况下,您应该使用this.name
将完全指向类成员变量。也可以使用getName()
。这只是风格问题。
答案 3 :(得分:1)
如果你需要使用原始数据类型,那么你应该使用它们,例如int,double,char,float等。唯一的例外是String,它在Java中是一个特殊的类,它代表一个char数组,也是持有实例方法。
Integer与int的情况是,您需要使用Integer方法(http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html)。但是如果你只需要一个数据类型来保存你的值,那么选择int。
答案 4 :(得分:1)
我保持简单。我正在使用name
,但如果我有一个同名的局部变量,我必须使用this.name
(我的首选解决方案)而不是getName()
。
如果它执行验证等逻辑,则必须使用getName()
。
答案 5 :(得分:1)
这主要是个人风格和原则问题。
private int someOtherNumber;
我几乎总是使用int
因为对我来说似乎更自然 - 可能会受到C天的影响。而且,从性能和内存使用的角度来看,使用int
是一个更好的选择。根据经验,除非我有充分的理由,否则我不会将对象用于基元。return this.getSomeOtherNumber();
我更喜欢使用getter / setter;因为有时 - 并非总是 - getter方法不仅仅是一个简单的return
语句,而是封装了一些逻辑。因此,我不会直接访问类属性(例如this.someAttr
或someClass.somePublicAttr
),除非它是final
属性。相信我,它更安全。继续2:看起来有点奇怪但是我有一个强大的Lisp背景,尽量避免使用偶数getter / setter方法(类状态),而是明确传递所需的参数并使用方法'返回值。请考虑以下示例:
public class C {
private int a;
private int b;
public int getA() { return a; }
public void setA(int a) { this.a = a; }
public int getB() { return a; }
public void setB(int b) { this.b = b; }
// Usual style
public void someMethod1(int x) {
mainLogic1(x);
}
private void mainLogic1(int x) {
b = a + x;
}
// My preferred style
public void someMethod2(int x) {
setB(mainLogic2(x, getA()));
}
private int mainLogic2(int x, int a) {
return x + a;
}
}
如您所见,someMethod1
和mainLogic1
都有副作用,在查看代码时很难检测到。另一方面,mainLogic2
根本没有副作用,someMethod2
副作用更容易被看到。这可能看起来有些过分,但它使我的Java代码更具可读性,更易测试,更容易重构,因为它包含大量小方法,没有副作用。
答案 6 :(得分:1)
Do you always pass Object or can you pass primitive data type ?
这取决于您的应用和您的需求。如果传递对象的引用,则可以使用相关类型的方法,这些方法可能更安全,更便携。假设您正在使用Double类。 Double有许多经过同行评审和测试的方法,可能对你有所帮助。如果你更喜欢使用原始类型,加倍,你需要小心你的操作,如比较,验证等。 对于性能问题,您可以查看以下的讨论: Why do people still use primitive types in Java?
Do you call variables using this.name, name or getName() inside your class instance ?
当我引用一个类成员时,我更喜欢使用它,因为我认为阅读我的代码会有助于理解该变量是一个类成员。
最后,无论你喜欢哪种风格,我认为你应该在你的应用中坚持下去。
您是否在类实例中使用this.name,name或getName()调用变量?