Tag: 封装

get和set方法有什么意义

在我的CS课程中,我只是学习课程和OOP。 因此,当您创建一个类时,您会初始化一定数量的私有变量。 我知道你把它们变成私有的,因为如果它们是公开的,它们很容易改变,并且可能导致很多错误。 所以我们使用get和set方法来改变变量。 但这又一次使变量很容易改变吗? 那么最初是将它们变为私有的呢?

如何设计可能使用skip的返回流

我创建了一个解析库,它接受提供的输入并返回记录流。 然后程序调用该库并处理结果。 就我而言,我的程序正在使用类似的东西 recordStream.forEach(r -> insertIntoDB(r)); 可以提供给解析库的输入类型之一是平面文件,其可以具有标题行。 因此,可以将解析库配置为跳过标题行。 如果配置了标题行,则会向返回添加skip(n)元素,例如 Files.lines(input)**.skip(1)**.parallel().map(r -> createRecord(r)); 解析库返回生成的Stream。 但是,似乎skip,parallel和forEach不能很好地结合在一起最终程序员必须调用forEachOrdered,但将这个要求放在程序员身上是不好的设计,期望他们知道如果处理输入类型他们必须使用forEachOrdered带有标题行的文件。 如何在返回的流链的构造中自己强制执行有序需求,以将完整function的流返回给程序编写器,而不是具有隐藏限制的流? 答案是将流包装在另一个流中吗?

在正确的OO设计之后使用另一个对象的function – 封装

我正在讨论正确的OO设计,以便从java类中使用另一个对象的function(方法),而两个对象尽可能保持解耦。 例如,在我的类中的某个时刻,为了实现我的逻辑,我需要调用一个属于另一个对象的方法,比如一个帮助类。 这个帮助器类不需要以任何方式与我的原始类相关,它只是有一个特定的方法,可供我的类使用。 在实现逻辑之后,不需要帮助方法(或辅助对象)。 显然,我需要引用这个辅助对象才能使用它的方法。 但是为了强制封装,我不应该在我的原始类中声明一个实例变量来引用这个帮助器对象? 这种推理是否正确? 此外,帮助程序类不知道可能使用它的任何客户端类。 在这种情况下,局部变量是否更合适? 在方法中声明并实例化helper对象,它将使用它的function? 原始类中最好的位置在哪里声明并实例化这样的辅助对象? 我想知道是否有一个高级示例,或者是否在OO文章中对此进行了详细阐述。 我很欣赏任何以封装为中心的输入或提示。

显示的吸气剂

我正在研究getters/setters ,一般的想法是它们是邪恶的,应该避免。 您应该让对象完成工作,并生成结果。 阅读材料: 为什么getter和setter方法是邪恶的 吸气剂和二传手设计不佳吗? 看到矛盾的建议 为什么要使用getter和setter? 考虑到所有这些,假设我有一个看起来像这样的Book class : publc final Book{ private final String title; private final List listofAuthors; private final int numberofpages; //constructor not included in example. //getters for title, listofAuthors, and numberofpages public int numberofpagesleft(int pagesRead){ //code to determine number of pages left } public boolean isWrittenBy(Author author){ //code to […]

Java:哪个更快? 局部变量或访问封装?

我最近读了一个StackOverflow问题 ,表明在访问变量时,使用堆栈比堆更快: void f() { int x = 123; // <- located in stack } int x; // <- located in heap void f() { x = 123 } 但是,我无法通过我的头脑工作,这在我的例子中更快(因为我假设他们都在使用堆栈)。 我正在研究hitbox计算等,它在函数中使用了很多XY,宽度,高度变量(每个最多10-20次)。 每次使用对象的get()方法或在函数开头将其设置为局部变量是否更快? 在代码中,它更快(或更高效): void f() { doSomething(foo.getValue() + bar.getValue()); doSomethingElse(foo.getValue(), bar.getValue()); doAnotherThing(foo.getValue(), bar.getValue()); // … <- lot's of accessing (something.getValue()); } 要么 void g() { […]

子类是否从超类inheritance私有实例变量

子类是否inheritance私有字段? 这个问题解决了同样的问题,但我不太明白这是如何满足下面(看似)相互矛盾的情况。 http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html 说“子类不inheritance其父类的私有成员”。 这意味着它既不inheritance私有实例变量也不inheritance私有方法? 但是,如果从父级inheritance公共访问器方法,它如何工作? 它返回一个它不知道存在的实例变量? 此外,我的计算机科学书籍(Baron的AP计算机科学A)对一个问题的正确答案是:“(子类)inheritance了(超类)的所有私有实例变量和公共访问器方法。” 这不是收缩到oracle的教程吗? 谢谢你的帮助

是否需要将私有嵌套类的内部声明为私有?

经过1000多年的private private ,我发现它可能不需要 public class Outer { private static class Inner { // you may drop static private void innerMethod() {} } } 是否有任何情况从innerMethod()中删除private会在封装中产生差异(或者由Outer 使用 )? 想想也反思 如果不是 ,建议放弃它或保持它的编码风格吗? 我会说不,然后放弃但不确定。 编辑:刚才意识到我这样做的方式肯定是错的 – 至少对于Inner的字段 – 将这些字段声明为私有然后在外部类中使用它们 – 因为这会在字节码中生成( “合成” )访问器 – 这是至少膨胀。 太棒了 – 所以现在我更感兴趣的是有一个关于声明那些( Inner字段, Outer使用的方法)包私有(或公共@JBNizet在评论中说)的安全含义的帐户

Java中可变对象的封装

我正在学习“Java SE 7程序员I和II学习指南”,我不明白下面的解释。 class Fortress{ private String name; private ArrayList list; Fortress() {list=new ArrayList; String getName{return name;} void addToList(int x){list.add(x);} ArrayList getList(){return list;} // line 1 } 哪行代码打破了封装? 答案:第9行。“当封装像ArrayList这样的可变对象时,你的getter必须返回对该对象副本的引用,而不仅仅是对原始对象的引用”。 我没有理解解释或如何修改原始代码。 所以在getList()而不是 return list; 我们应该这样做吗? ArrayList list2=list; return list2;

在Java中,让对象的成员公开可用是不是一个坏主意?

我的应用程序中有一个数据类。 我的应用程序永远不会被用作公共API,我将是唯一一个在我的项目中开发代码的人。 我试图保存每一盎司的处理器和内存电源。 在我的数据类中使我的数据成员具有公共/受保护/默认保护是不是一个坏主意,这样我就不必使用getter了? 使用getter需要更多的内存和堆栈的创建……我相信这是不必要的。 我在使用getter时可以看到的唯一原因是保护/隐私,但如果我是唯一的编码器而没有其他人会使用我的API,那么不使用getter是一个坏主意吗? 如果这是愚蠢的,请告诉我。

Dosen’t Reflection API打破了数据封装的目的吗?

最近我遇到了Reflection API,令我惊讶的是我们可以访问甚至更改私有变量。我尝试了以下代码 import java.lang.reflect.Field; public class SomeClass{ private String name = “John”; } public class Test{ public static void main(String args[]) throws Exception { SomeClass myClass = new SomeClass(); Field fs = myClass.getClass().getDeclaredField(“name”); fs.setAccessible(true); System.out.println(“Variable is ” + fs.getName() + ” and value is ” + fs.get(myClass)); fs.set(myClass, “Sam”); System.out.println(“Variable is ” + fs.getName() + […]