如您所知,"接口程序"设计原则广泛地倾向于使用超类型而不是具体类型或实现.
是否与在Java程序中使用instanceof从超类型派生具体类型的原则一致?
在我的应用程序中,Storehouse是一个抽象的超类型类,包含几个私有变量和公共getter和setter.
ConcreteStorehouseA继承自Storehouse,有很多具体的方法和变量.ConcreteStorehouseB类似但不同.
我的应用程序收到了一个仓库.但是,Storehouse不是一个有用的类型.因为具体类型中只包含真正有用的方法,所以我使用instanceof如下:
if (storehouse instanceof ConcreteStorehouseA) {
ConcreteStorehouseA concreteStorehouseA = (ConcreteStorehouseA) storehouse;
// perform operations on the concrete type's useful methods and variables
Run Code Online (Sandbox Code Playgroud)
使用instanceof与原理兼容吗?
编辑:
本质上,该应用程序是桌面RPG,Shadowrun的骰子模拟器.具体类型是不同的测试类型 - 成功测试,反对测试,扩展测试 - 它们的成功操作都有非常不同的因素和参数.超类型基本上包含骰子池!
在Java NIO中,很容易理解为什么ServerSocketChannel必须有一个选择器.选择器可以从几个准备好进行I/O操作的客户端通道中进行检查.
但是,在我在网上阅读的一些评论中,选择器机制应用于客户端SocketChannel.我不明白为什么选择器对客户端有用.任何人都可以解释为什么它只在一个服务器的通常情况下使用?
鉴于有限数量的项目有所不同,用堆叠的枚举和枚举构造函数表示它们还是将它们子类化更好?或者是否有更好的方法?
为了给你一些背景,在我的小RPG程序中(具有讽刺意味的是简单),角色在他或她的库存中有不同种类的物品.项目因类型,用途和效果而异.
例如,一个库存项目是一个名为Gremlin的拼写滚动,用于调整Utility属性.另一件物品可能是一把名为Mort的剑,用于战斗并造成伤害.
在我的RPG代码中,我现在尝试了两种表示库存项目的方法.一个办法是子类(例如,InventoryItem - >拼写 - > AdjustingAttributes; InventoryItem - >武器 - >剑)并在需要时实例化每个子类,以及诸如像的Gremlin和莫特名称分配值.
另一种方法是堆叠枚举和枚举构造函数.例如,我为itemCategory和itemSpellTypes以及itemWeaponTypes创建了枚举,而InventoryItem枚举是这样的:
public enum InventoryItem {
GREMLIN(itemType.SPELL, itemSpellTypes.ATTRIBUTE, Attribute.UTILITY),
MORT(itemType.WEAPON, itemWeaponTypes.SWORD, 30);
InventoryItem(itemType typeOfItem, itemSpellTypes spellType, Attribute attAdjusted) {
// snip, enum logic here
}
InventoryItem(itemType typeOfItem, itemWeaponTypes weaponType, int dmg) {
// snip, enum logic here
}
// and so on, for all the permutations of items.
}
Run Code Online (Sandbox Code Playgroud)
是否有比这两种方法更好的Java编程实践?或者,如果这些是唯一的方式,哪两个更好?提前感谢您的建议.
我的问题可以归结为:它是Swing编程中的标准结构,它允许侦听器控制新组件(例如新的JPanel)以进行显示和输入,并使新组件的侦听器控制新组件以进行显示和输入,等等到无穷大?或者Java是否需要恢复到某种统一类,它将所有Swing组件按程序顺序连接在一起?
目前,在我的应用程序中仅使用一个JFrame,在我的侦听器中,我的初始JFrame对象作为参数传递给我的所有JPanel,因此他们的侦听器可以调用removeall()来清除新JPanel的帧.例如,短代码如下
public class MainFrame {
JFrame jfrm;
public MainFrame() {
jfrm = new JFrame("Main Frame");
JPanel mainPanel = new MainPanel(jfrm);
}
}
public class MainPanel extends JPanel {
public MainPanel(final JFrame mainFrame) {
JButton example = new JButton("Example");
example.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent le) {
mainFrame.removeall();
JPanel 2ndPanel = new 2ndPanel(mainFrame);
mainFrame.add(2ndPanel);
mainFrame.validate();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
这是正确的结构 - 在哪里产生新面板的听众而不是一些统一的类?但是,如果是这样的话,如果有一个级联无限的侦听器,Java的编译器如何获得mainFrame.validate()?我是一个老派程序程序员,试图用Java编写Swing应用程序,我想我可能没有掌握Swing编程的基本概念.期待任何有用的答案,并提前感谢!
有没有办法迭代组件列表并将它们添加到Swing GroupLayout中的ParallelGroup?
这似乎很难,因为没有方法可以获得ParallelGroup.
以下是生成组件列表的代码(在本例中为JCheckBoxes).
List<JCheckBox> listCustomiseJCB = new ArrayList<>();
for (int w = 0; w < initialCMTableColumns.size(); w++) {
String heading = (String)initialCMTableColumns.get(w).getHeaderValue();
listCustomiseJCB.add(new JCheckBox(heading));
}
Run Code Online (Sandbox Code Playgroud)
列表正在工作,但我如何迭代List以将每个JCheckbox插入GroupLayout的ParallelGroup?例如,下面的代码将无法编译.
GroupLayout gl = new GroupLayout(jpnlCustomise);
jpnlCustomise.setLayout(gl);
gl.setAutoCreateContainerGaps(true);
gl.setAutoCreateGaps(true);
GroupLayout.SequentialGroup hGroup = gl.createSequentialGroup();
hGroup
.addComponent(jbtnApply);
hGroup.addGroup(gl.createParallelGroup(GroupLayout.Alignment.CENTER)
// ERRORS BEGIN HERE
{ for (JCheckBox c: listCustomiseJCB) {
.addComponent(c);
}});
// ERRORS END HERE
hGroup
.addComponent(jbtnCancel);
gl.setHorizontalGroup(hGroup);
Run Code Online (Sandbox Code Playgroud)
或者,是否有人知道如何获取ParallelGroup以便我可以在独立的for循环中迭代地将组件添加到该组?
我想知道是否可以在Java中创建动态变量.换句话说,变量会根据我的指示而变化.
编辑重新解释我的问题,我的意思是一个类的变量,它根据给定的变量更改类型(stockType,对于那些阅读的人).
仅供参考,我正在制作交易计划.给定的商家将有各种价格的待售物品.
我要求的活力是因为每种待售物品都有自己的特性.例如,book项有两个属性:int pages和boolean hardCover.相反,书签项具有一个属性String pattern.
这是代码的骨架片段,因此您可以看到我想要做的事情:
public class Merchants extends /* certain parent class */ {
// only 10 items for sale to begin with
Stock[] itemsForSale = new Stock[10];
// Array holding Merchants
public static Merchants[] merchantsArray = new Merchants[maxArrayLength];
// method to fill array of stock goes here
}
Run Code Online (Sandbox Code Playgroud)
和
public class Stock {
int stockPrice;
int stockQuantity;
String stockType; // e.g. book and bookmark
// Dynamic variables here, but they should only be invoked …
Run Code Online (Sandbox Code Playgroud) 鉴于需要循环到任意int值,将值转换为数组并为每个数组转换,或仅使用传统的for循环是否更好的编程实践?
仅供参考,我正在计算6个骰子的多个投掷中的5个和6个结果("命中")的数量.我的任意int值是dicePool,它表示多次抛出的次数.
据我了解,有两种选择:
将dicePool转换为数组并为每个数组转换:
public int calcHits(int dicePool) {
int[] dp = new int[dicePool];
for (Integer a : dp) {
// call throwDice method
}
}
Run Code Online (Sandbox Code Playgroud)使用传统的for循环:
public int calcHits(int dicePool) {
for (int i = 0; i < dicePool; i++) {
// call throwDice method
}
}
Run Code Online (Sandbox Code Playgroud)我的观点是选项1是笨拙的代码并且涉及不必要的数组创建,即使for-each循环比选项2中的传统for循环更有效.
我正在用Java制作一个非常简单的2D RPG.我的目标是尽可能简单地执行此操作.根据基础知识,我的班级结构目前是这样的:
到目前为止,我已经给了Player类一个NPC Humanoids的"派对"ArrayList,而NPC Humanoids类是一个"雇佣"的布尔值.
但是,我的战斗方法很笨重,在执行战斗之前使用if来检查方大小,例如
public class Player extends Humanoids {
private ArrayList<Humanoids> party;
// GETTERS AND SETTERS for party here
//...
public void fightEnemy(Enemy eneObj) {
if (this.getParty().size() == 0)
// Do combat without party issues
else if (this.getParty().size() == 1)
// Do combat with party of 1
else if (this.getParty().size() == 2)
// Do combat with party of 2
// etc.
Run Code Online (Sandbox Code Playgroud)
我的问题是,在面向对象设计中思考,我是否能够在尽可能简单的代码中做到这一点?有没有更好的办法?
我想知道是否有某种魔法可以用来解决IllegalStateException并允许JTextField"尝试在通知中变异",或者换句话说,如果触发了侦听器则设置自己的文本.
为了您的信息,我正在尝试编写一个自动完成函数,该函数返回12个枚举范围内最可能的匹配,以响应用户在JTextField中的输入.
这是代码示例.你必须原谅我笨拙的算法,这会扼杀枚举结果.我突出显示了通过注释产生异常的代码:
jtfElement1.addCaretListener(new CaretListener() {
@Override
public void caretUpdate(CaretEvent e) {
String s = jtfElement1.getText();
int[] attributes = new int[13];
// iterate through each enum
for (BaseEnumAttributes b: BaseEnumAttributes.values()) {
// iterate through the length of the current text in jtfElement1
for (int i = 0; i < s.length(); i++) {
if (s.length() <= b.toString().length()) {
if (b.toString().charAt(i) == s.charAt(i)) {
// increase the number of "hits" noted for that enum
attributes[b.ordinal()] = attributes[b.ordinal()] + 1;
}
}
} …
Run Code Online (Sandbox Code Playgroud) 假设JCheckBox
你想要用作开/关指示器.您setEnabled(false)
用来禁用鼠标点击JCheckBox
.但是setEnabled(false)
也会勾选checkBox和checkBox的文本.有没有办法定制,setEnabled(false)
以便不发生灰化?
如果那是不可能的,唯一的解决方案就是定制一个ButtonModel
?
对于我的交易计划,我有一个商人类.给定的商家对象可能具有或可能不具有特定的特殊质量或特殊品质的捆绑.例如,一个Merchant对象可能具有Stockbroker质量,另一个Merchant可能具有Financial Services和Stockbroker质量,而另一个Merchant可能没有特殊质量.
我最初的想法是创建一个HashMap和一个Qualities类,如下所示:
Map<Qualities, Boolean> merchantQualities = new HashMap<Qualities, Boolean>();
Run Code Online (Sandbox Code Playgroud)
唯一的问题是,商家至少有50种可能的特殊品质,因此从质量等级中分类所有品质会非常烦人.
是否有更好的方法来编码这些可选的特殊品质并在Merchants类中表示它们而不是HashMap并为Qualities类创建子类?
对于我的交易程序,Merchant对象具有使用布尔值枚举的Qualities的HashMap质量.
public class Merchants {
private Map<Qualities, Boolean> qualities = new HashMap<Qualities, Boolean>();
Run Code Online (Sandbox Code Playgroud)
我想给每个Merchant对象一个真实质量的进一步ratingQualities HashMap,用Byte或Integer值表示这些质量的等级.
例如,给定的商家可能具有与其真实股票经纪质量相关联的"1"评级.
问题是Java不允许我轻易做到这一点.以下代码演示了我的意图,但没有编译:
private Map<qualities-TRUE, Byte> ratedQualities = new HashMap<qualities-TRUE, Byte>();
Run Code Online (Sandbox Code Playgroud)
根据这个链接文本,一个解决方案是为HashMap的质量创建一个包装器.这是唯一的解决方案还是有更好的方法?
在此先感谢您的帮助.