@Override
public String toString() {
return new Gson().toJson(this);
}
Run Code Online (Sandbox Code Playgroud)
我是否通过简单地将此作为我的模型对象的默认行为来打破一些好的做法,"Joshua" -模式,一般设计模式或其他约定?
toString()无论如何只会在我们当前使用的范例(Android)中用于调试.这也是我喜欢在JSON中看到对象的原因,因为很多ORM/json持久性将通过http-> php/python-> mysql和本地SQLite发生.
当我和我的朋友们为考试而学习时,这个问题就出现了.调用静态赋值变量的方法时,我们注意到了奇怪的行为.
代码>单词所以我们走了:
class C {
public void a(double x) {}
}
class D extends C {
void b() {}
}
class F extends D {
void a(int i) {}
void a(double d) {}
Run Code Online (Sandbox Code Playgroud)
现在,做
D foo = new F();
foo.a(1);
Run Code Online (Sandbox Code Playgroud)
这会给什么?嗯..它在F中运行方法a(双)!
这就是我们想到的事情:
它是否正确?这意味着它爬上层次结构以找到一些方法,如果从int到double的类型转换完成,它可以适合.在此之后它检查动态类型是否具有这个新解释的签名.
我注意到,如果我加入
void a(int) {}
Run Code Online (Sandbox Code Playgroud)
**在C类中,当运行上面的调用时,它会在F中给我一个(int)!
有人可以解释一下这个过程中涉及的机制吗?为什么代码以这种方式运行/编译?这背后的技术原因是什么?还有更多关于类似情况应该注意的事情()
我正在编写一个代表一些简单几何的Java类.
在最顶层的abstract类(它本身就是包私有)我声明了需要从同一个包中的子类访问的属性.
如果我宣布一个属性作为final中AbstractClass,
final int foo;
Run Code Online (Sandbox Code Playgroud)
我可以直接在包中访问它,而不用任何getter方法.然而.根据"praxis"(或我认为是常见的风格)做的将是:
private final int foo;
Run Code Online (Sandbox Code Playgroud)
这当然需要一个非private吸气者.子类必须引用foo(这是一个非常相关和典型的属性),好像它是一些外部对象:
this.getFoo();
Run Code Online (Sandbox Code Playgroud)
它添加了代码并删除了访问这些成员的直接方式(即foo).
跳过private修饰符是否有任何缺点,因为它们无论如何都是最终的,我不担心在包内部暴露这些属性?
我知道OO倡导者声称getter/setter是对象访问他们自己的属性的一种非常自然的方式 - 但是什么时候这会使任何非整形,非[插入任何JavaBeans风格的东西],差异?
考虑一个内部类,Coordinate它非常简单,因为它有两个int属性 - 保留类的所有用法OuterClass:
class OuterClass{
final static class Coordinate{
final int x, y;
Coordinate(int x, int y){
this.x = x;
this.y = y;
}
}
Coordinate coordinate;
}
Run Code Online (Sandbox Code Playgroud)
对于这个内部阶级 - 为什么我会为创造一个吸气剂的实践而烦恼?getter会引入更多代码并强制同一个包中的任何类调用coordinate.getX();而不是简单地调用coordinate.x;.这有任何开销吗?注意final类上的修饰符Coordinate.