Tag: oop

在接口中添加默认和静态方法的原因

Java 8在接口上引入了默认和静态方法。 所以现在您可以在界面中使用默认或静态方法进行具体实现。 Java声称添加这两种新方法的原因是“确保与为这些接口的旧版本编写的代码的二进制兼容性”。 我的问题: 为什么要扭曲界面原始概念,假设是完全抽象的,以支持现有的架构问题? 除了类扩展多个接口的能力之外,使用抽象类和接口的新版本有什么区别?

在这样的构造函数中调用init方法是违反Clean Code的吗?

我在下面的代码中关注的是构造函数的参数实际上并没有直接映射到类的实例字段。 实例字段从参数中获取值,并且我正在使用initalize方法。 此外,我做了一些事情,以便创建的对象可以直接在后面的代码中使用,例如调用drawBoundaries()。 我觉得它正在做一个抽象意义上创建(初始化)Canvas的意思。 我的构造函数做得太多了吗? 如果我添加方法从外部显式调用构造函数中的东西,那就错了。 请让我知道你的看法。 public class Canvas { private int numberOfRows; private int numberOfColumns; private final List listOfCells = new LinkedList(); public Canvas(ParsedCells seedPatternCells) { initalizeCanvas(seedPatternCells); } private void initalizeCanvas(ParsedCells seedPatternCells) { setNumberOfRowsAndColumnsBasedOnSeedPatten(seedPatternCells); drawBoundaries(); placeSeedPatternCellsOnCanvas(seedPatternCells); } … PS:对不起,如果这看起来像个愚蠢的问题; 我的代码将由OOP大师审核,我只是担心:-0 编辑: 我读了一些关于initalizeCanvas()被覆盖的方法的担忧 – 幸运的是这些方法是私有的,不会调用任何其他方法。 无论如何,经过对网络的进一步研究,我开始喜欢这个…我希望你们同意!! ?? public class Canvas { private int numberOfRows; […]

为什么允许实例化静态嵌套类对象?

我已经开始学习用于Android应用程序开发的Java语言。 根据我对静态类的理解,我们无法实例化静态类的对象。 但是为什么静态嵌套类对象的实例化允许在后面的situaltion? class EnclosingClass { //… class static StaticInnerClass { //… } } 为什么我们可以创建内部类的对象,如果它被标记为静态? EnclosingClass.StaticInnerClass s = new EnclosingClass.StaticInnerClass()

为什么Java不支持通用Throwables?

class Bouncy extends Throwable { } // Error: the generic class Bouncy may not subclass java.lang.Throwable 为什么Java不支持通用的Throwable ? 我意识到类型擦除使某些事情变得复杂,但显然Java已经经历了很多,所以为什么不再推动它,并允许genericsThrowable s,通过全面的编译时检查潜在的问题? 我觉得类型擦除的论点相当薄弱。 目前,我们做不到: void process(List list) { } void process(List list) { } 当然,我们没有它。 我不是要求我们能够在同一个try块中catch Bouncy和Bouncy ,但是如果我们在具有严格编译时可执行规则的不相关上下文中使用它们(这几乎就是这样的话)仿制药现在正常工作),它不可行吗?

Ruby和duck打字:合同设计不可能?

Java中的方法签名: public List getFilesIn(List directories) 类似的ruby def get_files_in(directories) 对于Java,类型系统为我提供了有关该方法所期望和提供的信息。 在Ruby的情况下,我不知道我应该传递什么,或者我期望收到什么。 在Java中,对象必须正式实现接口。 在Ruby中,传入的对象必须响应此处定义的方法中调用的任何方法。 这似乎很成问题: 即使拥有100%准确,最新的文档,Ruby代码也必须公开其实现,打破封装。 除了“OO纯度”,这似乎是一个维护噩梦。 Ruby代码让我不知道返回了什么; 我必须基本上进行实验,或者阅读代码以找出返回对象将响应的方法。 不打算讨论静态打字与鸭子打字,而是希望了解如何维护一个几乎没有合同设计能力的生产系统。 更新 没有人真正通过这种方法所需的文档来解决方法内部实现的暴露问题。 由于没有接口,如果我不期望某个特定类型,我不必逐条列出我可能调用的每个方法,以便调用者知道可以传入什么内容吗? 或者这只是一个没有真正出现的边缘案例?

抽象和封装之间有什么区别?

可能重复: 抽象和封装之间的区别? Java中的封装和抽象之间究竟有什么区别? 任何简短的例子也将不胜感激。

用Java观察

我正在尝试理解Observer和Observable。 这是我想要弄清楚的一个例子: public class IntegerDataBag extends Observable implements Iterable { private ArrayList list= new ArrayList(); public void add(Integer i){ list.add(i); setChanged(); notifyObservers(); } public Iterator iterator(){ return list.iterator(); } public Integer remove (int index){ if (index< list.size()){ Integer i = list.remove(index); setChanged(); notifyObservers(); return i; } return null; } } public class IntegerAdder implements Observer […]

Java实例化

当一个对象在Java中实例化时,真正进入内存的是什么? 是否包含父母构造函数的副本? 为什么隐藏数据成员在转换时的行为与重写方法不同? 我理解通常用于正确使用这些东西的抽象解释,但JVM是如何做到的。

封装与信息隐藏

Ecapsulation和Information Hiding之间究竟有什么区别? 我知道将字段设为私有然后制作字段的setter和getter是ecapsulation.However封装意味着这个? 假设我有一个如下所述的课程。 public Class IsThisEncapsulation { public int age; public void setAge(int age) { this.age=age; } public int getAge() { return age; } } 现在是IsThisEncapsulation类是Encapsulation的一个例子吗? 现在是否会使上述class级中的“年龄”字段实现信息隐藏? 能否请您给我一些明确的例子,以帮助我清楚地区分这些概念?

为什么要声明一个接口然后在Java中用它实例化一个对象?

我和朋友正在学习Java。 我们今天正在研究接口,我们讨论了如何使用接口。 我朋友给我看的示例代码包含: IVehicle modeOfTransport1 = new Car(); IVehicle modeOfTransport2 = new Bike(); IVehicle是一个在汽车和自行车类中实现的接口。 定义接受IVehicle作为参数的方法时,可以使用接口方法,当运行代码时,上述对象正常工作。 然而,当您按照通常的意愿声明汽车和自行车时,这非常适用: Car modeOfTransport1 = new Car(); Bike modeOfTransport2 = new Bike(); 所以,我的问题是 – 为什么在声明和实例化modeOfTransport对象时,你会使用前一种方法而不是后者? 有关系吗?