我是一名初学者.我知道OOP的基础知识,但我还不知道"最佳实践".例如,一个继续出现在编程中的范例是"抽象工厂"设计模式,这似乎相当简单.其背后的一个关键意图是避免使用关键字"new",因为它被认为是有害的.我在编程课程中从未听过这个.有人可以详细阐述这一点吗?为什么我们要避免以这种形式实例化对象?
如果一个队列要被多个线程访问,但它目前只被一个方法修改getNextInQueue()
,那么同步访问队列的最合适形式是什么?
目前,我将队列声明为a ConcurrentLinkedQueue
,但我不希望在多个线程等待释放锁的情况下达到死锁.我可以解决这个问题的另一种方法是不同步队列,而是同步getNextInQueue()
.但是,由于将来会使用此代码,我认为这也不会扩展.(每个对队列进行修改的程序员都必须确保她同步操作.)
思考?
我并不像我想的那样理解Java GUI.在我的框架绘画方法中,我想擦除所有当前按钮,并添加新按钮.(总体目标是有一个用户可以看到字符的界面,然后单击按钮下载与角色相关的文档.由于每个角色都不同,当用户从我的列表中选择一个新用户时,一组新的文档和按钮将可供他们使用.)
这是我刚刚写的一个测试框架,它显示了横向发生的事情.它具有我在实际程序中使用的类似范例,没有太多的混乱:
public class GUITest extends JFrame
{
/**
* @param args
*/
public static void main(String[] args)
{
Container gui_test = new GUITest();
}
private JComponent content = null;
public GUITest()
{
super();
setVisible(true);
}
public void paint(Graphics g)
{
this.removeAll();
content = new JPanel();
JComponent test_button = new JButton("New Button 1");
JComponent button = new JButton("New Button 2");
content.add(button);
content.add(test_button);
this.add(content);
super.paint(g);
}
}
Run Code Online (Sandbox Code Playgroud)
如果没有调用removeAll(),按钮将继续被抛到JPanel的顶部,但是通过调用,什么也没有出现.我不知道为什么会这样,因为我正在适当地添加组件,对吧?
编辑
得到它,让我给你一个更详细的细分.客户端通过查看西面板上游戏中的角色列表来导航我的程序.他们可以从列表中选择一行,在东面板上显示字符详细信息.细节是图像和描述.最近,我为该特定字符添加了相关文档,该字符将显示在东面板的底部.我创建了关键监听器,因此客户端可以通过按下num键快速查看文档,但我也想让他们能够单击按钮启动pdf视图并查看文档的内容.
由于每个字符都有不同的相关文档和不同数量的文档,因此我每次都重新绘制按钮,以反映相关文档的数量和文档的相应标题.这是重绘的行为奇怪的地方.你给了我一个很好的解释,但是我不知道如何让客户端访问文档,除了绘制doc的描述以及启动它所需的热键.那有意义吗?
我有一个关于Java中泛型的基本问题:地图的以下两个初始化之间有什么区别?
Map<String, String> maplet1 = new HashMap<String, String>();
Map<String, String> maplet2 = new HashMap();
Run Code Online (Sandbox Code Playgroud)
我理解第一个初始化是指定对象构造中的泛型,但我不理解这样做的潜在后果,而不是后一个对象构造(maplet2).在实践中,我总是看到代码使用了maplet1构造,但是我不明白在另一个上面做这件事有什么好处.
我有一个关于在编码中使用"最佳实践"的基本问题.(我正在使用Java,但问题对于OOP来说是一般性的.)当为一个打算长期使用的类编写方法时,是否最好留下返回对象有或没有泛型?
在我的情况下具体来说,我正在Map<String, Integer>
使用该方法返回一个.我应该在return语句中指定它,还是应该只返回一个Map
?
以下编译错误对我来说毫无意义,我希望有人能够阐明:
static public void main(String args[]) throws ZipException, IOException
{
File file = new File("C:\\temp");
ZipFile zip_file = new ZipFile(file);
Enumeration<ZipEntry> entries = zip_file.entries();
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误: Type mismatch: cannot convert from Enumeration<capture#1-of ? extends ZipEntry> to Enumeration<ZipEntry>
为了编译上面的代码,我不得不替换entries
声明以使用泛型<? extends ZipEntry>
。为什么我必须这样做?ZipEntry 不扩展 ZipEntry 吗?(这不是空谈吗?)为什么编译器会抱怨?
如果有帮助,我将使用 Java 7.03 和 Eclipse Indigo 64 位。
我想为我的代码库创建一些不可变对象.真正传递给定类是不可变的消息的最佳方法是什么?我应该将所有字段都设为最终字段,并在对象构建期间进行初始化吗?(这看起来真的很尴尬......)我应该创建一些不可变的接口,并让对象实现它吗?(由于Java背后没有一些标准接口,我认为他们还有其他一些处理它的方法.)处理这个问题的标准方法是什么?(如果简单地通过在字段周围添加一堆注释来表示它们一旦初始化就不应该被修改,那也没关系.)
关于Java中正弦函数的快速问题.有谁知道如何计算价值?我在Java中发现了关于sin的这个问题,但是这就是为什么sin函数没有包含在本机代码中.我问的是完全不同的东西.我想知道该功能是如何实现的.(因为它是用本机代码包装的,所以我看不到它.)
他们是否只是从泰勒系列扩展中实现它:
sin(x) = x - (x^3)/3! + (x^5)/5! - O(x^7)
Run Code Online (Sandbox Code Playgroud)
我无法查看Math.sine()函数的代码,因为它包含在本机代码中.
关于Java语法的快速问题.我想采用Set并在库的静态方法中返回List.以下给出了编译器错误,我不知道为什么:
public static List<T> asList(Set<T> keySet)
{
// TODO Auto-generated method stub
return null;
}
Run Code Online (Sandbox Code Playgroud)
消息是"T无法解析为类型".但这不是Java中泛型类型的语法吗?
在Eclipse中,我可以对变量进行参考搜索,这样我就可以看到所讨论的变量已被加入/修改过的每个地方.有没有办法让我快速查看有问题的变量被修改的位置?(代码库很大......)
举个例子,
static public int test;
public static void main(String[] args)
{
test = 4;
if (test > 5) doNothing();
}
Run Code Online (Sandbox Code Playgroud)
我只希望搜索向我显示行test = 4;
,而不是if测试.